简单的正则表达式匹配包含<n>字符</n>的字符串

时间:2013-01-15 12:45:34

标签: java regex

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

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

我读这个的方式是,在字符串的开头和结尾之间,可以有多于或少于3个点而不是3个点。 令我惊讶的是,这不匹配hello.here.im.greetings 相反,我期望匹配。 我正在用Java写作,所以它的Perl就像风味一样,我不会逃避花括号,因为Java中不需要它 有什么建议吗?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

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

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

演示+解释:http://regex101.com/r/bS0qW1

请查看蒂姆的回答。