6

我正在编写这个正则表达式,因为我需要一种方法来查找没有 n 点的字符串,但我认为负面展望将是最好的选择,到目前为止我的正则表达式是:

"^(?!\\.{3})$"

我读这篇文章的方式是,在字符串的开头和结尾之间,可能有或多或少的 3 个点,但不是 3 个。令我惊讶的是,这与hello.here.im.greetings 我期望匹配的不匹配。我正在用 Java 编写,所以它具有类似 Perl 的味道,我没有转义花括号,因为它在 Java 中不需要任何建议?

4

2 回答 2

5

你在正确的轨道上:

"^(?!(?:[^.]*\\.){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();
于 2013-01-15T12:47:05.463 回答
1

您的正则表达式仅匹配“不”三个连续的点。您的示例似乎表明您希望在句子中的任何位置“不”匹配 3 个点。

尝试这个:^(?!(?:.*\\.){3})

演示+说明:http ://regex101.com/r/bS0qW1

请查看 Tims 的答案。

于 2013-01-15T12:49:31.837 回答