考虑一个具有以下格式的长字符串(括号不是实际文本的一部分,只是在这里添加以显示组限制):
(text, excluding the '=' character)(space)(ab = c d)(space)(e = f)(space)(g = h i):(space)(other text)
如何使用单个Java正则表达式将上述内容分解为以下3组?
text, excluding the equals character
ab = c d e = f g = h i
other text
第一组是随机文本(没有任何' ='字符),第二组是(可能很长)一系列键值对,其中没有':&# 39;字符和至少值之间可以有空格,第3组是随机文本的另一部分。第二组与第三组分开:':'字符。
以下正则表达式几乎"几乎"工作:
([^=]+)([^:]+):(.*)
但它产生的组是:
text, excluding the equals character ab
= c d e = f g = h i
other text
是否有任何方法可以"反向引用"第一组的最后一部分(即" ab"字符串),以便它包含在第二组而不是第一组中?
答案 0 :(得分:0)
以下内容应使用正则表达式分解字符串:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatching {
public static void main(String[] args) {
Pattern p = Pattern.compile("([^=]+) ([^=]+ = [^:]+): (.+)");
Matcher m = p.matcher("text, excluding the equals character ab = c d e = f g = h i: other text");
if (m.find()) {
//System.out.println(m.group(0));
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.group(3));
}
}
}
请注意,索引为0(已注释掉)的组将返回整个字符串。
关于:
是否有任何方法可以"反向引用"第一组的最后一部分 (即" ab"字符串),以便它包含在第二组中 而不是第一组?
使用上述正则表达式,我们强制键值对的第一个单词位于第二个捕获组中。 (这不是正则表达式术语中的"反向引用,因为这通常意味着返回其中一个捕获组。)
编辑:根据问题中的编辑更新了正则表达式。 EDIT2:回答了反向引用问题。