我正在编写这个正则表达式,因为我需要一种方法来查找没有 n 点的字符串,但我认为负面展望将是最好的选择,到目前为止我的正则表达式是:
"^(?!\\.{3})$"
我读这篇文章的方式是,在字符串的开头和结尾之间,可能有或多或少的 3 个点,但不是 3 个。令我惊讶的是,这与hello.here.im.greetings
我期望匹配的不匹配。我正在用 Java 编写,所以它具有类似 Perl 的味道,我没有转义花括号,因为它在 Java 中不需要任何建议?
你在正确的轨道上:
"^(?!(?:[^.]*\\.){3}[^.]*$)"
将按预期工作。
你的正则表达式意味着
^ # Match the start of the string
(?!\\.{3}) # Make sure that there aren't three dots at the current position
$ # Match the end of the string
所以它只能匹配空字符串。
我的正则表达式意味着:
^ # Match the start of the string
(?! # Make sure it's impossible to match...
(?: # the following:
[^.]* # any number of characters except dots
\\. # followed by a dot
){3} # exactly three times.
[^.]* # Now match only non-dot characters
$ # until the end of the string.
) # End of lookahead
按如下方式使用它:
Pattern regex = Pattern.compile("^(?!(?:[^.]*\\.){3}[^.]*$)");
Matcher regexMatcher = regex.matcher(subjectString);
foundMatch = regexMatcher.find();
您的正则表达式仅匹配“不”三个连续的点。您的示例似乎表明您希望在句子中的任何位置“不”匹配 3 个点。
尝试这个:^(?!(?:.*\\.){3})
演示+说明:http ://regex101.com/r/bS0qW1
请查看 Tims 的答案。