2012-06-15 210 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