Java模式匹配器的困境
我正在寻找一种模式来检查布尔项,但仅在某些条件下: 如果他们自己存在的话 字符串a=“AND”;字符串b=“\tand”;字符串c=“and”;Java模式匹配器的困境,java,regex,pattern-matching,Java,Regex,Pattern Matching,我正在寻找一种模式来检查布尔项,但仅在某些条件下: 如果他们自己存在的话 字符串a=“AND”;字符串b=“\tand”;字符串c=“and”; 如果它们不是单词或短语的一部分 String d=“这个或那个”; 要忽略的术语或短语: 字符串e=“band”;String f=“L”或“String g=“can do”; 到目前为止,我的代码只有在分隔符前后都有空格的情况下才能找到它们,并且任何形式的调整都会破坏我的进度。作为参考,但仍然没有骰子。我尝试过使用find()和matches
到目前为止,我的代码只有在分隔符前后都有空格的情况下才能找到它们,并且任何形式的调整都会破坏我的进度。作为参考,但仍然没有骰子。我尝试过使用find()和matches(),但find的范围似乎太广,匹配项似乎不够广泛。有什么想法吗
final static Pattern booleanTerms = Pattern.compile("(.*)(( OR )|( or )|( NOT )|( not )( AND )|( and ))(.*)");
public static void main(String[] args) {
Set<String> terms = new HashSet<String>();
terms.add(" OR"); //false
terms.add("or "); //false
terms.add("OR"); // false
terms.add(" or "); //true
for (String s : terms) {
System.out.println(findDilims(s));
} // end for loop
} // end main method
public static boolean findDilims(String s) {
Matcher matcher = booleanTerms.matcher(s);
if (matcher.matches()) {
return true;
} else {
return false;
}
} // end method
final static Pattern booleanTerms=Pattern.compile((.*)((或)|(或)|(非)|(非)|(和)|(和))(.*));
公共静态void main(字符串[]args){
Set terms=新的HashSet();
terms.add(“或”);//false
terms.add(“或”);//false
terms.add(“或”);//false
terms.add(“或”);//true
for(字符串s:术语){
System.out.println(findDilims);
}//循环结束
}//结束主方法
公共静态布尔findLims(字符串s){
Matcher Matcher=booleanTerms.Matcher;
if(matcher.matches()){
返回true;
}否则{
返回false;
}
}//结束方法
对于“OR”、“OR”和“OR”,您得到false的原因是您的模式显式地查找前后都有空格的布尔项:例如(OR)
查找”或“
”
您可能希望使用单词边界,而不是在每个布尔词之前和之后使用空格来确保每个布尔词都是单词:
Pattern.compile("\b(( OR )|( or )|( NOT )|( not )|( AND )|( and ))\b");
您可以使用\s*
在正则表达式的开头和结尾添加可选的空格。这样“或\t”
也将匹配
Pattern.compile("\s*\b(( OR )|( or )|( NOT )|( not )|( AND )|( and ))\b\s*");
matcher.matches()
现在应该可以正常工作了。您说过,只有当它们单独存在而不是作为短语的一部分时,才需要查找它们。那么您就不想以(.*)
开始和结束您的模式了
似乎您也希望找到它们,即使它们周围有空格。然后您需要使用\s*
开始和结束模式。即使之前或之后没有空间,您也希望找到它们。然后,您不希望在模式上留有空间,例如在(或)
中
您似乎希望它不区分大小写,因此您可能希望使用(?i)
您需要在术语的任意一端使用字符类作为替代:
(?i)(^\s*|[^a-z]\s)(or|not|and)(\s[^a-z]|\s*$)
您只需要一行:
public static boolean findDilims(String s) {
return s.matches(".*(?i)(^\\s*|[^a-z]\\s)(or|not|and)(\\s[^a-z]|\\s*$).*");
}
啊,谢谢你。似乎我过度构建了表达式,并没有按照自己的方式进行改进。关于案件不敏感的伟大提示@Spinish,谢谢你的帖子。你的解决方案与SiggiSv的非常相似,但我接受他的方案只是因为他加入了一个缩短表达式的片段…(?I)。
public static boolean findDilims(String s) {
return s.matches(".*(?i)(^\\s*|[^a-z]\\s)(or|not|and)(\\s[^a-z]|\\s*$).*");
}