使用正则表达式和Java从文本中提取内容

使用正则表达式和Java从文本中提取内容,java,regex,string,text,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中可以很好地提

我有一些这样的文字:

 //(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)(例如阿富汗历史),其中m是匹配器。 但是,如果文本是这样的话,它就会中断,因为华盛顿特区(即m.group(3))有一个逗号:

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

有人能帮我修改正则表达式并提取华盛顿特区的东西吗?谢谢

将您的第三个捕获组更改为捕获所有内容,直到达到关闭状态。这允许捕获每个字符(包括逗号)

更新:为了允许转义的
s,正则表达式如下所示。学分归Pshemo,见备注

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

您应该帮助使您的正则表达式更适合您的情况。 例如:

((.*?),(.*?),('.*?'),('.*?'),('.*?'))
我使用了妄想症
,这个解决方案对第3-5组的进一步妄想症也是不可知的


关于

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

/((.*?),(.*?),'(.*?)','(.*?)','(.*?)'\)/g
工作示例@

您需要将上述正则表达式转换/转义为与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所指出的,
不是元字符,或者它没有在限制重复中使用量词:
{min,max}

现在我正在等待OP提供的信息,标题中可能还有超过
'
。但现在看起来还可以。到目前为止,它不在示例输入中:DBTW,您可能不需要
'[^']*?'中的
。另外,
(.*)
也可以更改为
([^,]*)
@Knight。在这种情况下,您需要创建一些格式,让我们能够确定哪个
'
是标题的一部分,哪个
'
被视为表示标题结尾的报价。换句话说,您需要引入一些非特殊的
'
的转义机制,就像前面的
\
一样(但这也意味着
\
是特殊的,所以就像在字符串文本中一样,如果您想创建这样的符号,您也需要转义它),或者像SQL一样,用另一个
'
对每个文本
'
进行转义,如
'Marvin's_Room'
@Knight在这种情况下,请尝试编写接受非引号或转义引号,而不是只接受非引号字符的
[^']
。所以试着把
('[^']*')
改成类似
('(?:[^']\\\')*')
对不起,但是转义
有什么意义呢?它不是regex元字符之一(至少在这里不是-唯一的情况是
不代表文字的是
{min,max}
{,max}
之类的量词,但即使这样也没有必要逃避它)。@Pshemo,谢谢你指出这一点,我完全忘记了这一点。