Java正则表达式提取字符串的一部分

时间:2015-01-23 21:00:41

标签: java regex match

考虑一个具有以下格式的长字符串(括号不是实际文本的一部分,只是在这里添加以显示组限制):

(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"字符串),以便它包含在第二组而不是第一组中?

1 个答案:

答案 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:回答了反向引用问题。