使用Regex和Java从文本中提取内容

时间:2016-10-12 15:14:39

标签: java regex string text

我有一些这样的文字:

 //(10,0,'Computer_accessibility','',''),(13,0,'History_of_Afghanistan','',''),(14,0,'Geography_of_Afghanistan','','')

我写了一个模式:

public final static Pattern r_english = Pattern.compile("\\((.*?),(.*?),(.*?),(.*?),(.*?)\\)");

这在Java中很好地提取m.group(1)(例如13)和m.group(3)(例如History_of_Afghanistan),其中m是匹配器。 但是,如果文本是这样的话就会打破,因为华盛顿,_D.C。 (即m.group(3))中有一个逗号:

(8543,0,'Washington,_D.C.','',''),(8546,0,'Extermination_camp','','')

有人可以帮助我使用正则表达式修改它并提取华盛顿,_D.C。啄?感谢

3 个答案:

答案 0 :(得分:3)

更改第三个捕获组以捕获所有内容,直到达到结束'。这样就可以捕获每个角色(包括你的逗号)。

更新:为了允许转义',正则表达式看起来像这样。积分转到Pshemo,请参阅评论。

public final static Pattern r_english = Pattern.compile("\\((.*?),(.*?),('(?:[^']|\\')*'),(.*?),(.*?)\\)");

答案 1 :(得分:1)

您应该帮助使您的RegEx更具针对性。 例如:

((.*?),(.*?),('.*?'),('.*?'),('.*?'))

我使用了parantehesis ',这个解决方案对于3-5组的进一步调整也是不可知的。

此致

答案 2 :(得分:1)

您需要更改正则表达式以适合您要检索的所有匹配项,例如:

/((.*?),(.*?),'(.*?)','(.*?)','(.*?)'\)/g

工作示例@ regex101

您需要将上述正则表达式转换/转义为兼容Java的表达式,例如:

public static String REGEX_PATTERN = "\\((.*?),(.*?),'(.*?)','(.*?)','(.*?)'\\)";

然后,迭代尝试模仿//g修饰符的所有匹配项,例如:

while (matcher.find()) {
}

Java工作示例:

package SO40002225;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    public static String INPUT;
    public static String REGEX_PATTERN;

    static {
        INPUT = "(8543,0,'Washington,_D.C.','',''),(8546,0,'Extermination_camp','',''),(8543,0,'Washington,_D.C.','',''),(8546,0,'Extermination_camp','','')";
        REGEX_PATTERN = "\\((.*?),(.*?),'(.*?)','(.*?)','(.*?)'\\)";
    }


    public static void main(String[] args) {
        String text = INPUT;

        Pattern pattern = Pattern.compile(REGEX_PATTERN);
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            String mg1 = matcher.group(1);
            String mg2 = matcher.group(2);
            String mg3 = matcher.group(3);
            String mg4 = matcher.group(4);
            String mg5 = matcher.group(5);

            System.out.println("Matching group #1: " + mg1);
            System.out.println("Matching group #2: " + mg2);
            System.out.println("Matching group #3: " + mg3);
            System.out.println("Matching group #4: " + mg4);
            System.out.println("Matching group #5: " + mg5);
        }

    }

}

更新#1

在正则表达式中删除了逗号,的转义,正如Pshemo所指出的,,不是元字符,或者它没有在< strong>限制重复量词:{min, max}