改进正则表达式重复组

时间:2013-09-04 12:47:11

标签: regex

我正在尝试提取由连字符

分隔的字符串的两边
abc - def

目前我有

([^-]*)-([^-]*)

匹配1为abc,匹配2为def

有没有更优雅的方式来编写这个正则表达式,以便没有重复元素?即([^-]*)不重复两次。

5 个答案:

答案 0 :(得分:1)

使用非贪婪的比赛:

(.*?)-(.*)

查看显示有效的live demo

我认为它不能比这更简单。

答案 1 :(得分:1)

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

Java中的插图:

// yours
Matcher m1 = Pattern.compile("([^-]*)-([^-]*)").matcher("abc - def");
if (m1.find()) {
    System.out.println(m1.group(1));
    System.out.println(m1.group(2));
}

// mine
Matcher m2 = Pattern.compile("[^-]+").matcher("abc - def");
while (m2.find()) {
    System.out.println(m2.group());
}

输出相同。

答案 2 :(得分:0)

你可以匹配(.*)-(.*),连字符仍然必须匹配,因此它会分割2个表达式。 顺便说一句,您可以尝试在此类网站上进行在线检查 - http://regexpal.com/

答案 3 :(得分:0)

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

对于您的示例,这可能看起来像这样(Java):

String side = "([^-]*)";
String regex = side + "-" + side;

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

您可以使用([^-]*)-\1来引用之前组中匹配的内容,但这只会在双方相等时匹配,而不是匹配相同的模式,即,它匹配"abc-abc",但不匹配"abc-def"

答案 4 :(得分:0)

你可以这样做:

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

Regex 101 Demo