使用正则表达式和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,谢谢你指出这一点,我完全忘记了这一点。