2014-02-28 25 views
0

我有一个带有字符串的大数组。我需要使用数组中的字符串来形成模式。但是,对于文本中的字符串可能跨越多行。构造的模式不适用于多行标志。任何人都可以指出什么是错的?谢谢。Java正则表达式 - 多行

这里是我的代码:

String[] phrases = new String[2]; 
    phrases[0] = "student (male)"; 
    phrases[1] = "worker (female)"; 

    Pattern[] ptn = new Pattern[phrases.length]; 

    int i = 0; 
    for (String p : phrases) 
    { 
     p = Pattern.quote(p); 
     System.out.println(p); 
     ptn[i] = Pattern.compile(p+"\\:\\s\\w+",Pattern.MULTILINE); 
     i++; 
    } 

    String text = "student\n(male): John"; 
    System.out.println(text); 

    for(Pattern p : ptn) 
    { 
     Matcher m = p.matcher(text); 
     while(m.find()) 
     { 
      System.out.println(m.group()); 
     } 
    } 
+0

你有几个问题,其中最重要的是你的模式永远无法匹配给定的样本输入/输出;你可以重写这些字符串吗? – fge

+0

从文件中读取输入字符串数组。文本也从文件中读取。所以对字符串的所有修改都必须在程序中完成。 – user3321400

回答

2

在这里,你不需要那么MULTILINE标志:

由于@fge如前所述,该标志仅仅意味着^(和$)将匹配开始(和结束)的每个行在被测试的字符串。
提醒:默认行为(没有该标志)将导致^$分别匹配整个String的开始和结束


如果你想匹配,在某些时候,无论是空间新线,我建议你去尝试匹配\s

但是,如果替换以下行:

phrases[0] = "student (male)"; 
phrases[1] = "worker (female)"; 

由:

phrases[0] = "student\\s(male)"; 
phrases[1] = "worker\\s(female)"; 

那么你将无法使用Pattern#quote逃生括号。我认为,最简单的方法就是直接自己逃避这些如下:

phrases[0] = "student\\s\\(male\\)"; 
phrases[1] = "worker\\s\\(female\\)"; 

如果你确实不能修改这些字符串,你可能只是改变:

p = Pattern.quote(p); 

为:

p = p.replaceAll("(\\(|\\))", "\\\\"+"$1").replaceAll(" ", "\\\\s"); 

这将:

  • 逃脱()
  • \s更换空间()来匹配任一空格或新行。

这里是一个Ideone link到你的代码如何能成为:)

希望它可以帮助一些可执行的例子!

+0

+1也注意到需要'Pattern.quote()'!顺便说一下,你可以编辑你的文章,并重新添加关于'Pattern.MULTILINE'和'Pattern.DOTALL'的解释;) – fge

+0

糟糕,你是对的,我应该这样做!谢谢:) – ccjmne

+0

问题是我无法手动修改每个数组,因为数据太多。创建的模式不能使用替换:p = p.replaceAll(“\\(”,“\\(”); 和p = p.replaceAll(“\\)”,“\\)”);因此,我似乎必须使用Pattern#quote,我刚从另一篇文章中向您学习。 – user3321400