我想要匹配的语句不应包含除(AND,and,OR,or)以外的单词。我为此编写了以下代码:
Matcher mat2 = Pattern.compile(".*\\bAND|and|OR|or\\b.*").matcher(
expression);
boolean b2 = mat2.find();
我的输入字符串就像
(1 not and 2 or ( 3 and 4))
所以它返回的结果为true。但由于输入包含“not”字符串,输出应该为 false。所以我尝试了 stackoverflow 上已经给出的很多方法来否定表达式,但对我不起作用。我尝试了 ^.(?!AND|and|OR|or).$ 但它总是返回真实结果。
最佳答案
您似乎想要匹配一个仅包含列表中的单词且字符串中没有其他字母的字符串。
您可以使用
^(?:[^a-zA-Z]*(?:or|OR|and|AND))+[^a-zA-Z]*$
或者不区分大小写:
(?i)^(?:[^a-z]*(?:or|and))+[^a-z]*$
请参阅regex demo
使用String#matches()
,^
和$
变得多余:
s.matches("(?i)(?:[^a-z]*(?:or|and))+[^a-z]*")
详细信息:
(?i)
-Pattern.CASE_INSENSITIVE
嵌入选项(请注意,如果您只需要匹配特定的大小写变体,例如或
,OR
和AND
/and
,使用第一个正则表达式示例中的交替)^
- 字符串开头(可选matches()
)(?:[^a-z]*(?:or|and))+
- 出现 1 次或多次(因此,至少 1 个or
或且
必须存在):[^a-z]*
- 0+ ASCII 字母以外的字符(?:or|and)
-or
或and
文字字符序列
[^a-z]*
$
- 字符串结尾(可通过matches()
进行选择)。
关于java - 如何否定正则表达式中的特定单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40654026/