正则表达式正在返回不受欢迎的结果

时间:2015-07-22 16:26:39

标签: java regex

我正在尝试从正则表达式中捕获一个将遵循此模式的组:

Ex1 - anyanyany第1组必须为anyanyany

Ex2 - anyanyany.abcany第1组必须为anyanyany

Ex3 - anyany.abcde.fghi第1组必须为anyany.abcde

当我尝试(.+)(?:\.)时,它只返回Ex2和Ex3。如果我为(.+)(?:\.)*更改它,则返回相同的输入字符串。

我真的不知道自己要做些什么来解决它。有人可以帮帮我吗?我缺少哪些知识?

https://regex101.com/r/jG6wY8/2

4 个答案:

答案 0 :(得分:3)

您可以使用此正则表达式:

^([^.]+(?:\.[^.]+)?)

RegEx Demo

PS:regex101 demo中使用了^([^.\n]+(?:\.[^.\n]+)?),因为demo在不同的行中有多个输入。

答案 1 :(得分:2)

试试这个非贪婪的正则表达式。

(.+?)(?:\.[^.]*)?$

在java中你需要再次转义反斜杠,所以它就像是,

Pattern p = Pattern.compile("(.+?)(?:\\.[^.]*)?$");

DEMO

答案 2 :(得分:0)

而不是正则表达式捕获想要的部分,消除不需要的部分:

s = s.replaceAll("\\.[^.]+$","");

答案 3 :(得分:0)

尝试使用以下正则表达式模式以符合您的标准:

  • 如果您应该匹配由点标记的前两个单词:^([^\.]+)(?:\.[^\.]+)?$|(?:([^\.]+\.[^\.]+)\.)

    a => a a.b => a a.b.c => a.b a.b.c.d => a.b

  • 如果您应该匹配由点标记的每个单词,而不是最后一个标记:^([^\.]+)(?:\.[^\.]+)?$|(?:([^\.]+\.[^\.]+)\.)

    a => a a.b => a a.b.c => a.b a.b.c.d => a.b.c