所以我有一个字符串可以是:
aa -- bb -- cc -- dd -- ee
或
(.*?) -- (.*?) -- (.*?) -- (.*)((.*?)|)
aa,bb,cc,dd,ee可以是任何字符(分隔符除外是' - ')
这是我尝试过的:
CommentCreateStamp
它几乎可以工作。它可以正确捕获第一个而不是第二个。
我必须使用捕获组并在分隔符之间捕获字符串。只有匹配是不够的。
所以捕获组应该是
AA BB CC dd
OR
AA BB CC DD EE
答案 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 强>
如果你想要多个小组,你可以使用:
(.*?) -- (.*?) -- (.*?) -- (\S*)(?: -- (.*))?
<强> Working demo 强>
答案 5 :(得分:0)
将最后一个词设为 optional :
(\S+) -- (\S+) -- (\S+) -- (\S+)(?: -- (\S+))?
我还改为使用\S+
来避免错误字词或输入格式错误的误报。
还要注意使用非捕获组,以便第五个(可选)术语在第5组(而不是第6组)中。