Java 用于匹配包含<;的字符串的简单正则表达式;n>;查尔斯

Java 用于匹配包含<;的字符串的简单正则表达式;n>;查尔斯,java,regex,Java,Regex,我写这个regexp是因为我需要一个方法来查找没有n个点的字符串, 我认为消极展望是最好的选择,到目前为止,我的regexp是: "^(?!\\.{3})$" 我读这篇文章的方式是,在字符串的开始和结束之间,可以有多于或少于3个点,但不是3个。 让我惊讶的是,这不匹配hello.here.im.hellives 相反,我希望与之匹配。 我是用Java编写的,所以这是一种类似Perl的风格,我不会逃避大括号,因为Java不需要大括号 有什么建议吗?你走对了方向: "^(?!(?:[^.]*\\.

我写这个regexp是因为我需要一个方法来查找没有n个点的字符串, 我认为消极展望是最好的选择,到目前为止,我的regexp是:

"^(?!\\.{3})$"
我读这篇文章的方式是,在字符串的开始和结束之间,可以有多于或少于3个点,但不是3个。 让我惊讶的是,这不匹配
hello.here.im.hellives
相反,我希望与之匹配。 我是用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();
正则表达式只匹配“not”三个连续点。你的例子似乎表明你想在句子的任何地方“不”匹配3个点

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

演示+解释:


请查看Tims的答案。

嗨,蒂姆,恐怕这不是真的正确,(a.b.c.d)和(a.b.c)都将返回false,@Lindrian:你是对的;我假设他在寻找连续的三个点(我只是看正则表达式,而不是他的例子)。谢谢提醒me@TimPietzcker,它似乎真的不起作用,使用“hi.blabla.54589…….xl”将返回false,但事实并非如此,超过3个点应返回true,您是否按照我在回答中详述的方式使用正则表达式?如果您使用的是
.matcher()
方法(我建议您不要使用该方法,因为它会强制您匹配整个字符串,即使在第三个点之后您可能会停止匹配),那么您必须在regex.Pattern regex=Pattern.compile(^(?(?:[^.]*\\){3})的最末端添加一个
*
;Matcher regexMatcher=regex.Matcher(“hi.blabla.54589…….xl”);System.out.println(regexMatcher.find());这里有一个正则表达式测试页面:这是正确的,但效率很低,因为
*
也将匹配点。另外,除非您使用的是
.matches()
方法,否则最后的
*
是不必要的。您是正确的@TimPietzcker。我已经监督过了。谢谢你的指点。关于一个完全无关的问题,有没有办法联系你?看看我最新的编辑-我们都看错了问题。顺便说一句,在regex101查看你的邮箱:)很棒的网站@蒂姆皮埃茨克:啊,这个问题在这方面不是很清楚。谢谢