Word 的正则表达式之前没有一些特定的词

Regex for Word not have some specific words before

我正在为这个结果寻找正则表达式

String = 这是冷水,这是热水,喝点水。

我想检查这个字符串是否有 'Water' 这个词,它前面没有 'Cold' 和 'Hot' 个词。

String mydata = "This is Cold Water and this is Hot Water, have some Water";
Pattern pattern = Pattern.compile("[^(Cold|Hot)]\sWater");
    Matcher matcher = pattern.matcher(mydata);
    if (matcher.matches()) {
        String s = matcher.group(1);
        System.out.println(s);
    }

但结果不匹配

[^(Cold|Hot)]\sWater 模式匹配除 (Co ... ) 以外的任何字符,然后是单个空格,然后是Water 子字符串。 [^...] 是一个 否定字符 class,你不能用它否定字符序列。

您可以使用带有 negative lookbehind. The most basic form of it for your case is (?<!Cold\s|Hot\s) 的正则表达式,并且您可以进一步自定义它。

例如,\s 只匹配 1 个空格,如果 ColdWater 或 [=22= 之间有 2 个或更多空格,后向查找将不起作用] 和 Water。在 Java 正则表达式中,您可以使用 limiting quantifiers (see Constrained-width Lookbehind),因此您可以使用 \s{1,10} 允许向后查找 "see" 1 到 10 个空格。

另一个增强可能是整词匹配,用 \bword boundary construct.

将词括起来

注意 Matcher#matches() requires a full string match, you actually want to use Matcher#find().

这是一个示例解决方案:

String mydata = "This is Cold Water and this is Hot Water, have some Water";
        Pattern pattern = Pattern.compile("\b(?<!(?:\bCold\b|\bHot\b)\s{1,10})Water\b");
        Matcher matcher = pattern.matcher(mydata);
        if (matcher.find()) {
            System.out.println(matcher.group(0));
        }

参见Java online demo

图案详情

  • \b - 单词边界
  • (?<! - 如果在当前位置的左侧有:
    • (?: - non-capturing group 匹配两个备选方案之一的开始:
      • \bCold\b - 一个完整的单词 Cold
      • | - 或
      • \bHot\b - 一个完整的单词 Hot
    • ) - 非捕获组结束
    • \s{1,10} - 1 到 10 个空格(如果您确定单词之间只有 1 个空格,您可以使用 \s
  • ) - 回顾结束
  • Water - 搜索词
  • \b - 单词边界