java - 如何否定正则表达式中的特定单词

标签 java regex

我想要匹配的语句不应包含除(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 嵌入选项(请注意,如果您只需要匹配特定的大小写变体,例如 ORAND/and,使用第一个正则表达式示例中的交替)
  • ^ - 字符串开头(可选 matches())
  • (?:[^a-z]*(?:or|and))+ - 出现 1 次或多次(因此,至少 1 个 or 必须存在):
    • [^a-z]* - 0+ ASCII 字母以外的字符
    • (?:or|and) - orand 文字字符序列
  • [^a-z]*
  • $ - 字符串结尾(可通过 matches() 进行选择)。

关于java - 如何否定正则表达式中的特定单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40654026/

相关文章:

c# - 如何使用 C# Regex 获取最后一场比赛

c++ - 在不将它们包含在结果中的情况下在两个字符串之间获取结果?

java - Android string .equals 方法不起作用

Java Apache Beam - 使用 DataflowRunner 保存文件 "LOCALY"

python - 修复句子 : add space after punctuation but not after decimal points or abbreviations

javascript - 检索两个字符之间的子字符串

regex - 选择用 3 个换行符分隔的 block

java - 如何向 vaadin 组件添加 css 关键帧?

java - 动态创建 GWT CellTable

java - 在 Java 中恢复旧对象状态