我在 php 中有一些代码是使用 preg_grep 编写的,用于以任何上下文中可能存在的任何顺序匹配多个单词。我正在尝试将其转换为 Java,但我似乎无法弄明白。
我将关键字转换为正则表达式字符串的 php 代码是:
function createRegexSearch($keywords)
{
$regex = '';
foreach ($keywords as $key)
$regex .= '(?=.*' . $key . ')';
return '/^' . $regex . '/i';
}
它会创建一个类似于/^(?=.*bot)/i 的正则表达式字符串 - 它应该匹配 robot、robots、bots 等。相同的正则表达式字符串在 java 中似乎不起作用,这让我很困惑使困惑。目前在 Java 中,我使用 contains 创建了类似的效果,但更愿意使用正则表达式。
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());
}
最佳答案
Java 与许多语言不同的一件事是有两种不同的方法来“匹配”正则表达式与目标 - “matches()” 与 “find()” - matches 等同于将 ^
和 $
位于表达式的开头和结尾,而 find 查找 第一个匹配项(无论它在字符串中的什么位置)- 例如,当您可能能够在目标字符串robots
中find()
.*bot
,说matches()是不对的
目标...我不完全确定前瞻会如何影响这个...
如果没有发布的 Java 代码(包含问题),很难告诉您可能哪里出错了,但我的猜测是它很容易出现在这个区域。
此外,在 Java(和 .Net)中将 /i
放在表达式的末尾相当于将 (?i)
放在表达式的开头(或您想要区分大小写的任何区域)。因此,/[a-f0-9]/i
等同于 (?i)[a-f0-9]
关于Java - 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11055328/