2

我在 php 中有一些代码,我使用 preg_grep 以任何顺序匹配多个单词,这些单词可以存在于任何上下文中。我正在尝试将其转换为 java,但我似乎无法弄清楚。

我用于将关键字转换为正则表达式字符串的 php 代码是:

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

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

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());
}
4

4 回答 4

1

Java 与许多语言不同的一件事是有两种不同的方式来“匹配”正则表达式与目标 - “matches()”与“find()” - 匹配相当于将^and$放在你的开头和结尾表达式,而 find找到第一个匹配项(无论它可能在字符串中的哪个位置) - 例如,虽然您可能能够find() .*bot在目标字符串robots中找到,但说它matches()是目标是不正确的......我并不完全确定前瞻可能会如何影响这一点......

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

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

于 2012-06-15T19:46:09.650 回答
0

字符串包含区分大小写,因此第一个集合(PHP 代码)将表现得不区分大小写,因为使用了 \i。但是java代码会区分大小写。所以行为上会有差异。

因此,如果这是不同的,您将两者都转换为特定的字符集,在包含检查之前说 toUpperCase() 。

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

问候 Ajai G

于 2012-06-15T17:29:20.737 回答
0

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

于 2012-06-15T20:08:18.753 回答
0

JMPL是一个简单的 java 库,它可以使用 Java 8 的特性来模拟一些特性模式匹配。

   import org.kl.state.Else;
   import static org.kl.pattern.DeconstructPattern.matches;
   import static org.kl.pattern.DeconstructPattern.foreach;
   import static org.kl.pattern.DeconstructPattern.let;

   let(figure, (int w, int h) -> {
      System.out.println("border: " + w + " " + h));
   });

   matches(figure).as(
      Rectangle.class, (int w, int h) -> System.out.println("square: " + (w * h)),
      Circle.class,    (int r)        -> System.out.println("square: " + (2 * Math.PI * r)),
      Else.class,      ()             -> System.out.println("Default square: " + 0)
   );

   foreach(listRectangles, (int w, int h) -> {
      System.out.println("square: " + (w * h));
   });
于 2020-05-30T13:48:50.957 回答