我有以下模式:
Pattern TAG = Pattern.compile("(<[\\w]+]>)|(</[\\w]+]>)");
请注意|在模式中。
我有一个用这种模式进行处理的方法
private String format(String s){
Matcher m = TAG.matcher(s);
StringBuffer sb = new StringBuffer();
while(m.find()){
//This is where I need to find out what part
//of | (or) matched in the pattern
// to perform additional processing
}
return sb.toString();
}
我想根据OR匹配的部分执行不同的功能 正则表达式。我知道我可以将模式分解为两种不同的模式并匹配每种模式,但这不是我正在寻找的解决方案,因为我的实际正则表达式要复杂得多,如果我能做的话,我想要完成的功能最有效它在一个循环中和正则表达式。所以我的问题是:
在java中是否有办法找出正则表达式中匹配的OR的哪一部分?
修改
我也知道m.group()功能。它对我的情况不起作用。以下示例
打印出<TAG>
和</TAG>
因此,对于循环的第一次迭代,它在<[\\w]+>
上匹配
和第二次迭代它在</[\\w]+>
上匹配。但是我需要知道每次迭代匹配哪个部分。
static Pattern u = Pattern.compile("<[\\w]+>|</[\\w]+>");
public static void main(String[] args) {
String xml = "<TAG>044453</TAG>";
Matcher m = u.matcher(xml);
while (m.find()) {
System.out.println(m.group(0));
}
}
答案 0 :(得分:1)
查看Matcher
上的group()
方法,您可以执行以下操作:
if (m.group(1) != null) {
// The first grouped parenthesized section matched
}
else if (m.group(2) != null) {
// The second grouped parenthesized section matched
}
编辑:恢复到原始组号 - 不需要额外的数据。这应该使用如下模式:
static Pattern TAG = Pattern.compile("(<[\\w]+>)|(</[\\w]+>)");
答案 1 :(得分:0)
你应该通过分解公共部分来重写你的模式:
xy|xz => x(y|z)
xy|x => xy?
yx|x => y?x
然后,通过将诸如y?
之类的有趣部分放在括号中,您可以使用group()检查它是否已设置。
答案 2 :(得分:0)
您不必将[]
与\\w
一起使用,因为它已经是一个类。你也可以用括号括起OR的每个选项,然后将它们作为组使用(如果找不到其中一个组,它将具有空引用)。所以你的代码看起来像这样:
static Pattern u = Pattern.compile("(<\\w+>)|(</\\w+>)");
public static void main(String[] args) {
String xml = "<TAG>044453</TAG>";
Matcher m = u.matcher(xml);
while (m.find()) {
if (m.group(1)!=null){// <- group 1 (<\\w+>)
System.out.println("I found <...> tag: "+m.group(0));
}else{ // if it wasn't (<\\w+>) then it means it had to be (</\\w+>) that was mathced
System.out.println("I found </...> tag: "+m.group(0));
}
}
}
您还可以将模式稍微更改为<(/?)\\w+>
,使/
部分可选并将其放在括号中(在这种情况下将使其成为第1组)。这样,如果tag没有/
,那么group 1将只包含空字符串""
,因此您可以将逻辑更改为
if ("".equals(m.group(1))) {//
System.out.println("I found <...> tag: " + m.group(0));
} else {
System.out.println("I found </...> tag: " + m.group(0));
}