我正在尝试匹配以下两个示例中的一个:
示例输入1:
<a href="Substance/acide_flavodique-4454.htm">acide flavodique</a>
示例输入2:
<a href="Medicament/ciprofloxacine_arrow_750_mg_cp_pellic-71371.htm">CIPROFLOXACINE ARROW 750 mg cp pellic</a>
我需要在我的文件中打印的是:1- acide flavodique:如果它匹配第一个例子。 2-环丙沙星:如果它与第二个例子匹配。 我的正则表达式或其他什么问题? 提前谢谢!
BufferedReader lire = new BufferedReader(new FileReader(file1));
do{
String line = lire.readLine();
if(line == null)
{
break;
}
Pattern p = Pattern.compile ("<a href=\"Substance/.+>(.+)</a>|<a href=\"Medicament/.+>(.+)\\s+.+</a>");
Matcher m = p.matcher(line); System.out.println("match:"+m.group(1)+"\n");
if (m.matches()) {
writer.write(line);
writer.write(System.getProperty("line.separator"));
}
}while(true);
// }
writer.close();
}}}
答案 0 :(得分:2)
你的模式是:
<a href=\"Substance/.+>(.+)</a>|<a href=\"Medicament/.+>(.+)\\s+.+</a>
这包含一些'/'字符,这些字符被视为未转义的分隔符,使您的模式无效。您可以在此处测试此类内容:https://www.regex101.com/
答案 1 :(得分:1)
第一个问题:
Matcher m = p.matcher(line); System.out.println("match:"+m.group(1)+"\n"); if (m.matches()) { // ... }
这不起作用,因为在致电m.matches()
之前,您必须先致电m.group(1)
。
所以这会更好:
Matcher m = p.matcher(line);
if (m.matches()) {
System.out.println("match:"+m.group(1)+"\n");
// ...
}
第二个问题是与群体有关。 鉴于这种模式:
Pattern p = Pattern.compile("<a href=\"Substance/.+>(.+)</a>|<a href=\"Medicament/.+>(.+)\\s+.+</a>");
这些输入:
String line1 = "<a href=\"Substance/acide_flavodique-4454.htm\">acide flavodique</a>";
String line2 = "<a href=\"Medicament/ciprofloxacine_arrow_750_mg_cp_pellic-71371.htm\">CIPROFLOXACINE ARROW 750 mg cp pellic</a>";
这两行都匹配,但匹配的部分将在不同的组中。
对于line1
,&#34; acide flavodique&#34;将在.group(1)
,
但对于line2
,&#34; CIPROFLOXACINE ARROW 750 mg cp&#34;将在.group(2)
。
这是因为在正则表达式中,您有两个(...)
。
答案 2 :(得分:0)
你过早地调用m.group(..)。您应该先调用m.matches(),否则会出现IllegalStateException。
顺便说一句,找到 模式(至少你提供的两个例子是匹配的)。
答案 3 :(得分:0)
除非你关心找到哪一个,否则我猜你可以将这两者结合起来 需要的是一个单一的捕获组1.
# "<a\\s+href\\s*=\\s*\"\\s*(?:Substance|Medicament)/[^>]+>([\\s\\S]+?)</a>"
<a \s+ href \s* = \s* " \s*
(?: Substance | Medicament )
/ [^>]+
>
( [\s\S]+? ) # (1)
</a>