带有分隔符的正则表达式' - '没有递归

时间:2016-03-22 21:19:57

标签: java regex

所以我有一个字符串可以是:

aa -- bb -- cc -- dd -- ee

(.*?) -- (.*?) -- (.*?) -- (.*)((.*?)|)

aa,bb,cc,dd,ee可以是任何字符(分隔符除外是' - ')

这是我尝试过的:

CommentCreateStamp

它几乎可以工作。它可以正确捕获第一个而不是第二个。

我必须使用捕获组并在分隔符之间捕获字符串。只有匹配是不够的。

所以捕获组应该是

AA BB CC dd

OR

AA BB CC DD EE

6 个答案:

答案 0 :(得分:1)

如果你必须采用正则表达式方式,我会使用^(\\S+) -- (\\S+) -- (\\S+) -- (\\S+)(?: -- (\\S*))?$,将你的内容捕获到4或5个捕获组中。

我使用\ S来避免使用延迟匹配进行不必要的扩展,这会加速正则表达式。我还添加了开始和结束的锚点,因为它似乎想要匹配整个字符串。

注意:我不确定,java如何处理捕获组重复,在大多数正则表达式中,像(.){4}这样的构造只捕获最后一次重复。

答案 1 :(得分:0)

而不是捕捉匹配,只需使用明确定义的分隔符split字符串:

String text = "aa -- bb -- cc -- dd -- ee";
String[] parts = text.split("\\s*--\\s*"); // \s* to get rid of padding spaces
System.out.println(Arrays.toString(parts));

输出:[aa, bb, cc, dd, ee]

或者,如果您需要组信息(例如起始位置),您可以再次匹配循环中单个组的更简单的正则表达式:

Matcher m = Pattern.compile("(.+?)(?: -- |$)").matcher(text);
while (m.find()) {
    System.out.println("'" + m.group(1) + "'");
}

答案 2 :(得分:0)

以下两者都匹配,但如果需要,可能需要使其更加强大:

((.*?) -- ){3,4}(.*?)

答案 3 :(得分:0)

如果我不得不使用单个正则表达式匹配并检索组中的所有字符,我将使用以下之一:

([^ -]{2}).*([^ -]{2}).*([^ -]{2}).*([^ -]{2})(?:.*([^ -]{2}))?

(.{2}) -- (.{2}) -- (.{2}) -- (.{2})(?: -- (.{2}))?

(.*?) -- (.*?) -- (.*?) -- (.*?)(?: -- (.*?))?

答案 4 :(得分:0)

您可以使用这样的简单正则表达式:

 -- |(..)
^--^------ notice the spaces

<强> Working demo

enter image description here

如果你想要多个小组,你可以使用:

(.*?) -- (.*?) -- (.*?) -- (\S*)(?: -- (.*))?

<强> Working demo

enter image description here

答案 5 :(得分:0)

将最后一个词设为 optional

(\S+) -- (\S+) -- (\S+) -- (\S+)(?: -- (\S+))?

我还改为使用\S+来避免错误字词或输入格式错误的误报。

还要注意使用非捕获组,以便第五个(可选)术语在第5组(而不是第6组)中。