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
模式匹配除 (
、C
、o
... )
以外的任何字符,然后是单个空格,然后是Water
子字符串。 [^...]
是一个 否定字符 class,你不能用它否定字符序列。
您可以使用带有 negative lookbehind. The most basic form of it for your case is (?<!Cold\s|Hot\s)
的正则表达式,并且您可以进一步自定义它。
例如,\s
只匹配 1 个空格,如果 Cold
和 Water
或 [=22= 之间有 2 个或更多空格,后向查找将不起作用] 和 Water
。在 Java 正则表达式中,您可以使用 limiting quantifiers (see Constrained-width Lookbehind),因此您可以使用 \s{1,10}
允许向后查找 "see" 1 到 10 个空格。
另一个增强可能是整词匹配,用 \b
、word 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));
}
图案详情
\b
- 单词边界
(?<!
- 如果在当前位置的左侧有:
(?:
- non-capturing group 匹配两个备选方案之一的开始:
\bCold\b
- 一个完整的单词 Cold
|
- 或
\bHot\b
- 一个完整的单词 Hot
)
- 非捕获组结束
\s{1,10}
- 1 到 10 个空格(如果您确定单词之间只有 1 个空格,您可以使用 \s
)
)
- 回顾结束
Water
- 搜索词
\b
- 单词边界
我正在为这个结果寻找正则表达式
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
模式匹配除 (
、C
、o
... )
以外的任何字符,然后是单个空格,然后是Water
子字符串。 [^...]
是一个 否定字符 class,你不能用它否定字符序列。
您可以使用带有 negative lookbehind. The most basic form of it for your case is (?<!Cold\s|Hot\s)
的正则表达式,并且您可以进一步自定义它。
例如,\s
只匹配 1 个空格,如果 Cold
和 Water
或 [=22= 之间有 2 个或更多空格,后向查找将不起作用] 和 Water
。在 Java 正则表达式中,您可以使用 limiting quantifiers (see Constrained-width Lookbehind),因此您可以使用 \s{1,10}
允许向后查找 "see" 1 到 10 个空格。
另一个增强可能是整词匹配,用 \b
、word 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));
}
图案详情
\b
- 单词边界(?<!
- 如果在当前位置的左侧有:(?:
- non-capturing group 匹配两个备选方案之一的开始:\bCold\b
- 一个完整的单词Cold
|
- 或\bHot\b
- 一个完整的单词Hot
)
- 非捕获组结束\s{1,10}
- 1 到 10 个空格(如果您确定单词之间只有 1 个空格,您可以使用\s
)
)
- 回顾结束Water
- 搜索词\b
- 单词边界