繁体   English   中英

Java - 模式匹配

[英]Java - Pattern Matching

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

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

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

它会创建一个类似于以下内容的正则表达式字符串:/^(?=.*bot)/i - 它应该匹配机器人、机器人、机器人等。相同的正则表达式字符串似乎在 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()” vs “find()” - 匹配相当于将^$放在开头和结尾在您的表达式中,虽然 find找到第一个匹配项(它可能在字符串中的任何位置) - 例如,虽然您可能能够find() .*bot在目标字符串robots ,但说它matches()是不正确的matches()目标......我不完全确定前瞻会如何影响这个......

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

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

String contains 是区分大小写的,所以第一组(PHP 代码)的行为不区分大小写,因为使用了 \\i。 但是 java 代码会区分大小写。 所以行为上会有差异。

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

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

问候 Ajai G

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM