Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 带分隔符的Regexp';——';无递归_Java_Regex - Fatal编程技术网

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+))?