我的正则表达式与我的java程序中的东西不匹配

时间:2014-12-20 18:52:00

标签: java regex

我正在尝试匹配以下两个示例中的一个:

示例输入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();
        }}}

4 个答案:

答案 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>