2013-07-03 122 views
0

我必須找到在文本中的單詞或正則表達式,並使用java.util.regexp.Matcher for this與匹配問題

的方法必須做,我有以下幾點:

final ArrayList<String> regexps = config.getProperty(property); 
for (String regexp: regexps){ 
    Pattern pt = Pattern.compile("." + regexp + ".", Pattern.CASE_INSENSITIVE); 
    Matcher mt = pt.matcher(plainText);    
     if (mt.find()){ 
      result = result + "DENIED. reason: " + property; 
      reason = false; 
      LOG.info("reason " + mt.group() + regexp); 
      } 
} 

但此代碼爲某種原因不能找到正則表達式в[ыy][шs]лит[еe]文本

Вышлите пожалуйста новый счет на оплату на asda, пока согласовывали, уже 
прошли его сроки. Лицензионный догово 
+0

如果您已設置區域設置,您還沒有提到過嗎? – zEro

+0

該怎麼做?你認爲這很重要嗎?至於我,我猜想這條消息可以包含英文或俄文文本或兩者兼而有之。 –

+0

是的,我錯了。你不必擔心這種情況。 – zEro

回答

2

有兩個問題:

  • 指定點前和比賽結束後,因此,每個單詞需要一個字符;嘗試用\b(或"\\b"作爲Java字符串)替換您的點,這是單詞錨;
  • 您指定Pattern.CASE_INSENSITIVE。但是this flag only works for ASCII。如果你想匹配其他字符,你必須添加Pattern.UNICODE_CASE到你的模式編譯標誌。

即:

Pattern.compile("whatever", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); 

最後一點,[ee]e是等價的,你可能是指別的東西在這裏。

+0

+1注意'[ee]' – zEro

+0

哦,我的意思是俄語和英語e。他們可以被取代以規避安全。 –

+0

@NikitinMikhail安全嗎?安全與此有什麼關係? – fge

2

替換:

Pattern pt = Pattern.compile("." + regexp + ".", Pattern.CASE_INSENSITIVE); 

有:

Pattern pt = Pattern.compile(".*" + regexp + ".*", Pattern.CASE_INSENSITIVE);