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

7

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

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

我的理解是,在字符串的开头和结尾之间,可能有多于或少于3个点,但不能刚好为3个。 令我惊讶的是,这与 hello.here.im.greetings 不匹配,而我原本预期它应该匹配。 我在使用Java编写代码,所以它是Perl风格的,我不需要在Java中转义花括号。 有什么建议吗?


这里有一个正则表达式测试页面:http://www.regexplanet.com/advanced/java/index.html - Luciano
2个回答

5

您正在正确的轨道上:

"^(?!(?:[^.]*\\.){3}[^.]*$)"

will work as expected.

Your regex means

^          # 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();

嗨,Tim,恐怕这不是正确的,(a.b.c.d)和(a.b.c)都会返回false。 - JBoy
@Lindrian:你说得对,我假设他是在寻找连续的三个点(我只看了正则表达式,没有看他的例子)。感谢你提醒我。 - Tim Pietzcker
@TimPietzcker,它似乎并没有真正起作用,使用“hi.blabla.54589.......xl”将返回false,这不应该是这种情况,超过3个点应该返回true。 - JBoy
你是否按照我的答案详细说明的方式使用了正则表达式?如果你正在使用.matcher()方法(我建议不要使用它,因为它强制你匹配整个字符串,即使你在第三个点之后停止匹配),你必须在正则表达式的最后添加.* - Tim Pietzcker
模式 regex = Pattern.compile("^(?!(?:[^.]*\.){3})"); 匹配器 regexMatcher = regex.matcher("hi.blabla.54589.......xl"); System.out.println(regexMatcher.find()); - JBoy
@JBoy:哦!我真的应该更仔细地阅读你的问题。我的正则表达式只检查三个或更多,而不是恰好三个点。现在它应该可以工作了。对于造成的困惑,我感到抱歉。 - Tim Pietzcker

1

你的正则表达式只匹配“不是”三个连续的点。你的示例似乎显示您想要在句子中“不”匹配3个点。

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

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

请查看Tims的答案。


这是正确的,但非常低效,因为.*也会匹配点。 此外,如果您使用.matches()方法,则最终的 .* 是不必要的。 - Tim Pietzcker
你是正确的@TimPietzcker。我忽略了那个。感谢指引。完全没有关联的话题,有什么联系你的方式吗? - Firas Dib
1
请注意我的最新修改-我们两个都读错了问题。并且请检查你的regex101邮箱 :) 顺便说一句,这是一个很棒的网站! - Tim Pietzcker
@TimPietzcker:啊,那个问题在那方面并不十分清晰。谢谢! - Firas Dib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接