我正在为此结果寻找正则表达式
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);
}
但结果是不匹配
答案 0 :(得分:1)
[^(Cold|Hot)]\sWater
模式匹配除(
,C
,o
... )
以外的任何字符,然后是单个空格,然后是{{ 1}} substring。 Water
是一个否定的字符类,你无法用它来否定字符序列。
您可以使用带有negative lookbehind的正则表达式。对于您的案例,最基本的形式是(?<!Cold\s|Hot\s)
,您可以进一步自定义它。
例如,[^...]
仅匹配1个空格,如果\s
和Cold
或Water
之间有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
- 字边界