Java正则表达式 - 按组搜索字符串

时间:2013-12-18 21:47:32

标签: java regex

请有人能帮我解释一下:

我们有一个正则表达式,用于检查字符串是否与特定序列匹配。正则表达式如下所示:

JPRN(JAPICCTI\d{6})|(JAPICCTI\d{6})

我想尝试理解这段代码试图实现的目标:

matcher = Pattern.compile("JPRN(JAPICCTI\d{6})|(JAPICCTI\d{6})");

Matcher m = matcher.matcher("JAPICCTI132323");

if(m.find()){
  Matcher m2 = matcher.matcher(m.group());
  if(m2.find()){
     return m2.replaceAll("$1")    
   }    

}

它尝试检查的字符串(即JAPICCTI132323)与正则表达式匹配。 然而,我不理解为什么匹配完成两次,即使用字符串并再次使用“组”。这样做的原因是什么?

还有$ 1字符串的目的是什么。

这是失败的,因为m2.replaceAll(“$ 1”)返回一个空字符串,但我希望它返回JAPICCTI132323。鉴于我不明白它在做什么,我很难理解为什么结果是一个空字符串

提前致谢。

1 个答案:

答案 0 :(得分:2)

|符号表示更改,表示“首先匹配左侧组,如果不匹配,请尝试第二组”


$1符号表示匹配的内容,在这种情况下,它只会将替换为本身。


如果您有多个捕获组:(one\d+)(two\w+\d)(three.*?)

然后,您可以使用$1$2$3来表示匹配的字符串。


在其他正则表达式实现中,您可以将捕获组命名为:(?<first match>regexpattern)(?<phone number>\d{2}\s\d{4}),但遗憾的是,在Java中,它不可用。


您可能需要进行一些测试,但您可以指定$1$2作为替换,因为如果其中一个为null,则除了另一个匹配之外不会添加任何内容。

但如果两者都匹配,则会导致问题,因为替换时会有两个字符串。