请有人能帮我解释一下:
我们有一个正则表达式,用于检查字符串是否与特定序列匹配。正则表达式如下所示:
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。鉴于我不明白它在做什么,我很难理解为什么结果是一个空字符串
提前致谢。
答案 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,则除了另一个匹配之外不会添加任何内容。
但如果两者都匹配,则会导致问题,因为替换时会有两个字符串。