Java 带分隔符的Regexp';——';无递归
我有一个字符串,可以是:Java 带分隔符的Regexp';——';无递归,java,regex,Java,Regex,我有一个字符串,可以是: aa -- bb -- cc -- dd 或 aa、bb、cc、dd、ee可以是任何字符(分隔符'--'除外) 这就是我尝试过的: (.*?) -- (.*?) -- (.*?) -- (.*)((.*?)|) 它几乎起作用了。它可以捕获第一个,但不能正确捕获第二个 我必须使用捕获组和捕获分隔符之间的字符串。仅仅匹配是不够的 所以捕获组应该是 aa bb 复写的副本 dd 或 aa bb 复写的副本 dd ee不捕获匹配项,只需使用定义良好的分隔符来拆分字符串: S
aa -- bb -- cc -- dd
或
aa、bb、cc、dd、ee可以是任何字符(分隔符'--'除外)
这就是我尝试过的:
(.*?) -- (.*?) -- (.*?) -- (.*)((.*?)|)
它几乎起作用了。它可以捕获第一个,但不能正确捕获第二个
我必须使用捕获组和捕获分隔符之间的字符串。仅仅匹配是不够的
所以捕获组应该是
aa
bb
复写的副本
dd
或
aa
bb
复写的副本
dd
ee不捕获匹配项,只需使用定义良好的分隔符来拆分字符串:
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) + "'");
}
以下两者都匹配,但如果需要,您可能希望使其更加健壮:
(.*?){3,4}(.*?
如果您必须使用正则表达式,我将使用^(\\S+)(\\S+)(\\S+)(\\S+)-(\\S+)(\\S+)?$将您的内容捕获到4或5个捕获组中
我使用了\S来避免使用惰性匹配进行不必要的扩展,这将稍微加快正则表达式的速度。我还为开始和结束添加了锚,因为您似乎希望匹配整个字符串
注意:我不确定java如何处理捕获组重复,在大多数正则表达式风格中,像(..{4}
这样的构造将只捕获最后一个重复。如果我不得不使用单个正则表达式匹配并检索组中的所有字符,我将使用以下方法之一:
([^ -]{2}).*([^ -]{2}).*([^ -]{2}).*([^ -]{2})(?:.*([^ -]{2}))?
(.{2}) -- (.{2}) -- (.{2}) -- (.{2})(?: -- (.{2}))?
(.*?) -- (.*?) -- (.*?) -- (.*?)(?: -- (.*?))?
您可以使用如下简单的正则表达式:
-- |(..)
^--^------ notice the spaces
如果您需要多个组,您可以使用:
(.*?) -- (.*?) -- (.*?) -- (\S*)(?: -- (.*))?
将最后一个术语设置为可选:
我还改为使用\S+
,以避免丢失术语或输入格式错误的误报
另请注意使用非捕获组,因此第五个(可选)术语在组5(而不是组6)中。string.split(“-”)
?可能类似于:((.*)-){3,4}(.*)
@您必须使用捕获组还是只需要匹配整个字符串?-
和whitespace是否允许使用字符,例如aa
?@Shafizadeh,再试一次,我有一个额外的空间:)延迟匹配回溯-延迟匹配没有回溯。但是,有一个开销,是的。@WiktorStribiżew对于incalid示例字符串a b c d e f g
,每个空格都会有回溯,直到它最终失败,例如,^(.*)-(.*)
-如果我不完全理解它的错误<代码>^(\S+)-(\S+)但是,当它点击b
查看正则表达式引擎对惰性子模式的操作时,它将失败。没有回溯,如果没有找到匹配项,只会重试后续模式;如果可以匹配当前模式中的更多字符,则惰性子模式会在不匹配项上“展开”position@WiktorStribiżew as regex101将扩展标记为回溯(例如,请参见调试器中的)我把术语弄混了——我编辑了我的答案,希望能更准确
(.*?) -- (.*?) -- (.*?) -- (\S*)(?: -- (.*))?
(\S+) -- (\S+) -- (\S+) -- (\S+)(?: -- (\S+))?