3

我正在尝试提取由连字符分隔的字符串的两侧

abc - def

目前我有

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

比赛 1 是abc,比赛 2 是def

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

4

5 回答 5

1

使用非贪婪匹配:

(.*?)-(.*)

查看显示它工作的现场演示。

我认为没有比这更简单的了。

于 2013-09-04T12:50:50.923 回答
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());
}

输出是相同的。

于 2013-09-04T13:00:33.533 回答
0

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

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

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

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

您可以使用 引用之前组中匹配的内容([^-]*)-\1,但这仅在两侧相等时才匹配,而不是如果它们匹配相同的模式,即匹配"abc-abc",但不匹配"abc-def"

于 2013-09-04T13:13:03.117 回答
0

你可以这样做:

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

正则表达式 101 演示

于 2013-09-04T13:16:32.627 回答
0

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

于 2013-09-04T12:54:12.600 回答