2013-07-03 103 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);