Regex for Word之前没有一些特定的单词

时间:2018-05-26 15:36:23

标签: regex regex-negation

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

String =这是冷水,这是热水,有一些水。

我想检查一下这个字符串是否含有' Water'没有这些'感冒'和'热''在它之前的话。

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);
    }

但结果是不匹配

1 个答案:

答案 0 :(得分:1)

[^(Cold|Hot)]\sWater模式匹配除(Co ... )以外的任何字符,然后是单个空格,然后是{{ 1}} substring。 Water是一个否定的字符类,你无法用它来否定字符序列。

您可以使用带有negative lookbehind的正则表达式。对于您的案例,最基本的形式是(?<!Cold\s|Hot\s),您可以进一步自定义它。

例如,[^...]仅匹配1个空格,如果\sColdWater之间有2个或更多空格,则后台效果不起作用Hot。在Java正则表达式中,您可以使用limiting quantifiers(请参阅Constrained-width Lookbehind),因此您可以使用Water来允许lookbehind“看到”后面的1到10个空格。

另一项增强功能可能是全字匹配,请将\s{1,10}word boundary construct括起来。

请注意,Matcher#matches()需要完整的字符串匹配,您实际上想要使用Matcher#find()

以下是一个示例解决方案:

\b

请参阅Java online demo

模式详情

  • 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)); } - 字边界
  • \\b - 如果在当前位置的左侧立即有:
    • (?<! - 开始non-capturing group匹配以下两种选择中的任何一种:
      • (?: - 整个字\\bCold\\b
      • Cold - 或
      • | - 整个字\\bHot\\b
    • Hot - 非捕获组的结束
    • ) - 1到10个空格(如果您确定单词之间只有1个空格,则可以使用\\s{1,10}
  • \s - 结束后面的
  • ) - 搜索词
  • Water - 字边界