我该如何获取正则表达式匹配的内容?

3
我有成千上万个不同的正则表达式,它们看起来像这样:
^Mozilla.*Android.*AppleWebKit.*Chrome.*OPR\/([0-9\.]+)
我该如何获得与正则表达式中的.*匹配的子字符串?例如,对于上面的正则表达式,我会得到四个不同的.*的子字符串。此外,我不知道有多少个.*,尽管我可以通过对给定的正则表达式字符串进行一些简单的操作来可能找出,但这将给程序带来更多的复杂性。我处理了相当大量的数据,所以请着重考虑效率。
2个回答

5

.*替换为(.*)并使用matcher.group(n)。例如:

Pattern p = Pattern.compile("1(.*)2(.*)3");
Matcher m = p.matcher("1abc2xyz3");
m.find();

System.out.println(m.group(2));
xyz

注意第二个(.*) 的匹配结果被返回了(因为使用了m.group(2))。

此外,由于你提到你不知道你的正则表达式中会包含多少个.*,如果你的正则表达式中唯一捕获的组确实是(.*),那么可以使用matcher.groupCount()方法。

为了让您更好地理解,请阅读有关捕获组的内容。


3
如何获取符合正则表达式中 .* 的子字符串?例如,对于上述正则表达式,我将得到四个不同的DOT STAR子字符串。请使用分组:(.*) 此外,我事先不知道有多少个DOT STAR。建立你的正则表达式字符串,然后用(.*)替换.*
String myRegex = "your regex here";
myRegex = myRegex.replace(".*","(.*)");

即使我可以通过对给定的正则表达式字符串进行一些简单的操作来找出它,但那会给程序带来更多的复杂性。

如果您不知道正则表达式是如何构建的,且该正则表达式不是由您的应用程序构建的,则唯一的方法是在获取后进行处理。如果您正在构建正则表达式,请将(.*)附加到正则表达式字符串中,而不是附加.*


1
进一步说,你必须咬紧牙关处理正则表达式,无论你是否喜欢它,我希望你已经编写了只有一个正则表达式,并且只需要处理一次,这对系统资源的消耗不会太大。即使它是非常长的正则表达式,也不能比字符串本身更长。另一方面,如果你为每个字符串使用不同的正则表达式,那么你可能做错了。 - David Knipe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接