Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式正在返回不希望的结果_Java_Regex - Fatal编程技术网

Java 正则表达式正在返回不希望的结果

Java 正则表达式正在返回不希望的结果,java,regex,Java,Regex,我正试图从正则表达式中捕获一个遵循以下模式的组: Ex1-anyanyany组1必须是anyanyanyany Ex2-anyanyany.abcany1组必须是anyanyany Ex3-anyany.abcde.fghi1组必须是anyany.abcde 当我尝试(.+)(?:\)时,它只返回Ex2和Ex3。如果我将其更改为(.+)(?:\)*,它将返回相同的输入字符串 我真的不知道我该怎么解决它。有人能帮我吗?我缺少哪方面的知识 您可以使用此正则表达式: ^([^.]+(?:\.[^.]+

我正试图从正则表达式中捕获一个遵循以下模式的组:

Ex1-
anyanyany
组1必须是
anyanyanyany

Ex2-
anyanyany.abcany
1组必须是
anyanyany

Ex3-
anyany.abcde.fghi
1组必须是
anyany.abcde

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

我真的不知道我该怎么解决它。有人能帮我吗?我缺少哪方面的知识


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

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


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

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

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


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

请尝试此非贪婪正则表达式

(.+?)(?:\.[^.]*)?$
在java中,您需要再次避开反斜杠,因此

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

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

(.+?)(?:\.[^.]*)?$
在java中,您需要再次避开反斜杠,因此

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

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

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

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

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

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

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

    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


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

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

    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


为什么不简单地搜索最后一个字符“.”?为什么不简单地搜索最后一个字符“.”?如果想法是获取除最后一个点加字母以外的所有字符,那么正则表达式将无法使用abc.def.ghi.jkl,即它只返回abc.def,我不喜欢其中的\n-其目的是什么?想法是获取带有一个或两个点的字符串。因此,是的,它将匹配来自
abc.def.ghi.jkl.mno.pqr
@anubhava的
abc.def
,感谢您的回答(+1)。如果我们把
anyany.abcany
作为输入,输出将是
anyanyany
。但是它返回的是
anyanyany.abcany
您可以看到,这个问题并不清楚您是否希望在点之后匹配除最后一个字符串以外的所有字符串。如果想法是获取除最后一个点加上字母以外的所有字符串,那么您的正则表达式将以abc.def.ghi.jkl失败,也就是说,它只返回abc.def,我不喜欢里面的\n-它的目的是什么?想法是用一个或两个点抓住绳子。因此,是的,它将匹配来自
abc.def.ghi.jkl.mno.pqr
@anubhava的
abc.def
,感谢您的回答(+1)。如果我们把
anyany.abcany
作为输入,输出将是
anyanyany
。但是它返回的是
anyanyany.abcany
你可以看到,这个问题不清楚你是否想在点之后匹配除最后一个字符串以外的所有字符串。你不必在[and]之间转义点(.)。而且正则表达式与a.b.c.不匹配。d@laune:为了完成您的评论,我编辑了我的回复。您不必跳过[和]之间的点(.)。而且正则表达式与a.b.c.不匹配。d@laune:为了完成您的评论,我编辑了我的回复。