我正在尝试在Java中使用正则表达式来匹配<b><number></b>
对中包含的<a><\a>
形式的所有字符串。
e.g。 <a> kljsdlk <b>123</b> df <b>345</b> sdfklj</a>
应与<b>123</b>
和<b>345</b>
匹配两次,而<v> kljsdlk <b>123</b> df <b>345</b> sdfklj</v>
则不会产生任何结果(因为没有包装<a></a>
)。
以下代码是我目前最好的结果:
Pattern MY_PATTERN = Pattern.compile("(<a>.*(<b>[0-9]*<\\\\b>)?.*<\\\\a>)");
Matcher m = MY_PATTERN.matcher("<a> skdjlkasjflkj <b>200<\\b> sldfhjhfj d lkj b <b>300<\\b> fhih 9 09 <\\a>");
while (m.find()) {
for (int i=0; i< m.groupCount() ;i++){
String s = m.group(i);
System.out.println(s);
}
}
此代码结果为:
<a> skdjlkasjflkj <b>200<\b> sldfhjhfj d lkj b <b>300<\b> fhih 9 09 <\a>
<a> skdjlkasjflkj <b>200<\b> sldfhjhfj d lkj b <b>300<\b> fhih 9 09 <\a>
我希望它能导致:
<b>200<\b>
<b>300<\b>
答案 0 :(得分:1)
为什么不首先匹配<a>.*</a>
,然后查找<b>[0-9]*</b>?
Pattern p1 = Pattern.compile("(<a>.*</a>)");
Pattern p2 = Pattern.compile("<b>\\d*</b>");
Matcher m1 = m1 = p1.matcher("<a> kljsdlk <b>123</b> df <b>345</b> sdfklj</a>");
if (m1.find()) {
Matcher m2 = p2.matcher(m1.group());
while (m2.find()) {
System.out.println(m2.group());
}
}
答案 1 :(得分:0)
问题是您已匹配模式中的整个字符串。您应该只为内部标记创建一个模式。这将提供正确的匹配字符串
答案 2 :(得分:0)
如果Java支持任意长度的lookbehinds,那么可能能够做到这一点。没有它,仅在正则表达式中这是不可能的。此外,由于它是HTML / XML,因此可以更直观地使用专用于此类的库。