我正在尝试提取由连字符分隔的字符串的两侧
abc - def
目前我有
([^-]*)-([^-]*)
比赛 1 是abc
,比赛 2 是def
。
有没有更优雅的方式来编写这个正则表达式,以便没有重复元素?即([^-]*)
不重复两次。
我正在尝试提取由连字符分隔的字符串的两侧
abc - def
目前我有
([^-]*)-([^-]*)
比赛 1 是abc
,比赛 2 是def
。
有没有更优雅的方式来编写这个正则表达式,以便没有重复元素?即([^-]*)
不重复两次。
只需使用[^-]+
并迭代结果。
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());
}
输出是相同的。
如果您的正则表达式更复杂,您可以将其拆分为更小的块,然后重用它们。
对于您的示例,这可能如下所示(Java):
String side = "([^-]*)";
String regex = side + "-" + side;
但是,虽然这对于重复的复杂正则表达式很有用(想想电子邮件验证等),但在您的情况下,重复的版本是完全可以的。
您可以使用 引用之前组中匹配的内容([^-]*)-\1
,但这仅在两侧相等时才匹配,而不是如果它们匹配相同的模式,即匹配"abc-abc"
,但不匹配"abc-def"
。
您可以只 match (.*)-(.*)
,连字符仍然必须匹配,因此它会拆分 2 个表达式。顺便说一句,您可以尝试在这样的网站上在线检查 - http://regexpal.com/