Regex 精炼正则表达式重复组

Regex 精炼正则表达式重复组,regex,Regex,我试图提取由连字符分隔的字符串的两侧 abc - def 目前我有 ([^-]*)-([^-]*) 匹配项1将是abc,匹配项2将是def 有没有更优雅的方法来编写这个正则表达式,这样就不会有重复的元素?i、 e.([^-]*)不会重复两次。使用非贪婪匹配: (.*?)-(.*) 看到一个显示它工作的例子 我认为这样做再简单不过了。你可以只匹配(.*)-(.*),连字符仍然需要匹配,这样它就可以分割两个表达式。 顺便说一句,你可以尝试在这样的网站上在线检查-只需使用[^-]+并迭代结果 J

我试图提取由连字符分隔的字符串的两侧

abc - def
目前我有

([^-]*)-([^-]*)
匹配项1将是
abc
,匹配项2将是
def


有没有更优雅的方法来编写这个正则表达式,这样就不会有重复的元素?i、 e.
([^-]*)
不会重复两次。

使用非贪婪匹配:

(.*?)-(.*)
看到一个显示它工作的例子


我认为这样做再简单不过了。

你可以只匹配
(.*)-(.*)
,连字符仍然需要匹配,这样它就可以分割两个表达式。
顺便说一句,你可以尝试在这样的网站上在线检查-

只需使用
[^-]+
并迭代结果

Java中的插图:

//你的
matcherm1=Pattern.compile(“([^-]*)-([^-]*)”).Matcher(“abc-def”);
if(m1.find()){
系统输出println(m1组(1));
系统输出println(m1组(2));
}
//地雷
Matcher m2=Pattern.compile(“[^-]+”).Matcher(“abc-def”);
while(m2.find()){
System.out.println(m2.group());
}

输出是相同的。

如果您的正则表达式更复杂,您可以将其拆分为更小的块,然后重用这些块

对于您的示例,这可能如下所示(Java):

然而,虽然这对于重复的复杂正则表达式很有用(想想电子邮件验证之类的),但在您的情况下,有重复的版本是完全可以的


您可以通过使用
([^-]*)-\1
来引用在早期组中匹配的内容,但这将仅在两侧相等时匹配,而不是在它们匹配相同的模式时匹配,即它将匹配
“abc abc”
,而不是
“abc def”

您可以这样做:

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

我认为正则表达式非常好。同意@arshajii的观点-在这种情况下,您不需要尝试更简单的方法。如果至少有4组,那么是的,这是有意义的。相关:事实上,每一方可能不像([^-]*)那么简单。如果是20个字符左右,那么重复两次看起来很难看。我从来都不知道这个懒惰的操作符,直到现在!如果我的问题不清楚,那就很抱歉;我不想简化括号内的部分。不幸的是,我需要捕获文本进行处理。我无法使这种方法起作用。@user2675345您的意思是需要在不同的捕获组中捕获双方,还是要在一个组中捕获全部内容?分别捕获每一方。重用表达式的前一部分没有\1等价物,是吗?我想常量字符串或宏可能是表示我已有内容的更优雅的方式。我最喜欢这个解决方案。我假设find()是std::regex_搜索或std::regex_迭代器的Java版本。谢谢你。
(?:[^-]*-?){2}