2012-06-15 262 views
2

我在php中有一些代码,我使用preg_grep在任何上下文中以任何顺序匹配几个单词。我试图将其转换为Java,但我似乎无法弄清楚。Java - 模式匹配

为关键字转换为正则表达式的字符串我的PHP代码:

function createRegexSearch($keywords) 
{ 
    $regex = ''; 
    foreach ($keywords as $key) 
     $regex .= '(?=.*' . $key . ')'; 
    return '/^' . $regex . '/i'; 
} 

这将创建一个类似正则表达式的字符串:/^(?=.*bot)/i - 这应该匹配机器人,机器人,机器人等。相同的正则表达式字符串似乎不工作在Java这让我感到困惑。目前在java中,我用contains创建了一个类似的效果,但宁愿使用regex。

for (Map.Entry<String, String> entry : mKeyList.entrySet()) 
{ 
    boolean found = true; 
    String val = entry.getValue().toLowerCase(); 
    for (int i = 0; i < keywords.length; i++) 
    { 
     if (!val.contains(keywords[i].toLowerCase())) 
      found = false; 
    } 

    if (found) 
     ret.add(entry.getValue()); 
} 
+0

你能发布不起作用的java代码吗? – gcochard

回答

1

一件事Java那样比许多语言不同的是有“匹配”针对目标正则表达式的两种不同的方式 - “匹配()”与“发现()” - 比赛是把^$在开始和你表达的结束,同时发现相当于找到的第一场比赛(无论它可能是在字符串中) - 例如当你也许可以find().*bot目标串robots,它不会是真的说它matches()的目标......我不完全确定如何看向前方mi ght会影响这...

没有发布Java代码(包含问题),很难告诉你哪里可能会出错,但我的猜测是它可以很容易地在这个区域。

此外,将/i放在Java(和.Net)表达式的末尾时,会将(?i)放在表达式的开头(或任何要区分大小写的区域)。因此,/[a-f0-9]/i相当于(?i)[a-f0-9]

0

该字符串包含区分大小写,因此第一组(PHP代码)会在使用\ i后表现为不敏感的情况。但是java代码将会区分大小写。所以会有行为上的差异。

所以,如果这是不同的,你将两端都转换为特定的字符集,比如包含检查前的toUpperCase()。

此外,您正在PHP代码中使用正则表达式,而不是在Java中,这背后的任何具体原因?

问候 Ajai摹

+0

是的我在PHP中使用的正则表达式代码似乎没有在java中工作。我确实将所有事情都改为小写,但对于我所需要的数据集,似乎需要大约半秒钟的时间,我认为可以通过正则表达式来减少 – Joseph

0

您可以使用嵌入式标志扩展名(?i),因此您应该使用的正则表达式匹配bot,robot,bot和robot是(?i)^(.*bots?)$这应该适用于String.matches或Pattern/Matcher