2013-07-09 44 views
3

我有成千上万不同的正则表达式,它们看起来就像这样:如何获取正则表达式中匹配的内容?

 
^Mozilla.*Android.*AppleWebKit.*Chrome.*OPR\/([0-9\.]+) 

我如何获得这些匹配正则表达式的.*的子字符串?例如,对于上述正则表达式,我会得到四个不同.* s的子串。另外,我不知道有多少个.*,尽管我可以通过对给定的正则表达式字符串进行一些简单的操作来找到它,但这会给程序带来更多的复杂性。我处理的数据量相当大,因此真正关注效率。

回答

5

.*替换为(.*)s并使用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)使用)。

而且,既然你提到你不会知道.* S如何许多您正则表达式将包含有一个matcher.groupCount()方法,你可以使用,如果在你的正则表达式的唯一捕获组的确会(.*)秒。

为了您自己的启发,请尝试阅读capturing groups

3

如何获得匹配正则表达式中的。*的子字符串?例如,对于上述正则表达式,我会为四个不同的DOT STAR获得四个子字符串。

使用群体:(.*)


我另外,我不知道提前多少DOT明星有

建立你的正则表达式的字符串,然后将其替换.*(.*)

String myRegex = "your regex here"; 
myRegex = myRegex.replace(".*","(.*)"); 

即使我可以尽可能了解,通过做给定的正则表达式的字符串一些简单操作,但会对该方案

更加复杂。如果你不知道如何正则表达式被创建,并且正则表达式不是由您的应用程序构建的,唯一的方法是在您拥有它之后处理它。如果你正在构建正则表达式,然后(.*)附加到正则表达式字符串,而不是追加.*

+1

除了你必须硬着头皮和处理正则表达式无论你喜欢还是不喜欢,我希望你已经写了它所以只有一个正则表达式,只需要处理一次,这不会对系统资源造成很大影响。即使它是一个非常长的正则表达式,它不能比字符串本身更长。另一方面,如果你为每个字符串使用不同的正则表达式,那么你可能会做错了。 –