Java - 模式匹配

标签 java php regex

我在 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 查找 第一个匹配项(无论它在字符串中的什么位置)- 例如,当您可能能够在目标字符串robotsfind().*bot,说matches()是不对的 目标...我不完全确定前瞻会如何影响这个...

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

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

关于Java - 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11055328/

相关文章:

java - 带扩展的初始化 block

php - 2011 : DIVs OR TABLEs? Div/Input/Labels 是否仍然可行,还是 XHTML Tables (tables/tr/td) 重新流行?

php - Instagram API 不提供超过 100 个用户的关注者?

php - 从字面上看,将二进制数据写入文件

javascript - 使用正则表达式将缩进从空格更改为制表符

Javascript正则表达式获取脚本标签之间的src url

java - 如何加快oracle普通语句批量操作?

java - Arrays.copyOf 产生浅拷贝还是深拷贝?

java - 来自validation.api的@Pattern想要在一个属性文件中配置所有模式

java - 如何根据对象的属性从对象列表中提取值?