模式不匹配文本文件中的所有短语

时间:2012-11-08 21:41:29

标签: java pattern-matching

我的程序未显示所需的匹配结果。我的文本文件包含以下行:

  1. 红车
  2. 蓝色或红色
  3. 红色
  4. 汽车
  5. 所以,如果我搜索:“红色汽车”。我只获得“红色汽车”作为唯一的结果,但我想要的是获得以下结果:

    1. 红车
    2. 红色
    3. 红色
    4. 汽车
    5. 因为这些字符串在文本文件中。蓝色或红色,“或”是合乎逻辑的。所以我想要匹配其中任何一个,而不是两个。我究竟做错了什么?  任何帮助表示赞赏。我的代码如下:

          public static void main(String[] args) {
              // TODO code application logic here
              //String key;
              String strLine;
              try{
          // Open the file that is the first 
          // command line parameter   
          FileInputStream fstream = new FileInputStream("C:\\textfile.txt");
          // Get the object of DataInputStream
          DataInputStream in = new DataInputStream(fstream);
              BufferedReader br = new BufferedReader(new InputStreamReader(in));
              Scanner input  = new Scanner (System.in);         
              System.out.print("Enter Your Search:  ");
              String key = input.nextLine();
      
              while ((strLine = br.readLine()) != null) {     
              Pattern p = Pattern.compile(key); // regex pattern to search for
              Matcher m = p.matcher(strLine);  // src of text to search
              boolean b = false;
              while(b = m.find()) {  
              System.out.println( m.start() + " " + m.group()); // returns index and match
          // Print the content on the console
              }
              }
              //Close the input stream
           in.close();  
              }catch (Exception e){//Catch exception if any
             System.err.println("Error: " + e.getMessage());
          }
         }
       }
      

2 个答案:

答案 0 :(得分:1)

尝试传递此正则表达式: -

"((?:Red)?\\s*(?:or)?\\s*(?:Car)?)"

这将匹配: -

0 or 1红色后跟0 or more空格,然后是0 or 1 Car

(?:...)是非捕获组

注: - 上述正则表达式不匹配: - Car Red

如果您的订单可以撤销,那么您可以使用: -

"((?:Red|Car)?\\s*(?:or)?\\s*(?:Red|Car)?)"

group(0)获取完整的匹配。

例如: -

String strLine = "Car or Red";
Pattern p = Pattern.compile("((?:Red|Car)?\\s*(?:or)?\\s*(?:Red|Car)?)"); 
Matcher m = p.matcher(strLine);  // src of text to search

if (m.matches()) {  
    System.out.println(m.group()); // returns index and match
}

输出: -

Car or Red

while(b = m.find())替换为if (m.matches()),因为您希望匹配完整字符串,只需一次。

答案 1 :(得分:-1)

您的模式应为Red|Car