Java - 模式匹配

时间:2012-06-15 17:14:58

标签: java php regex

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

4 个答案:

答案 0 :(得分:1)

Java与许多语言的不同之处在于有两种不同的方法可以将正则表达式与目标“匹配” - “matches()”vs“find()” - 匹配等同于放置^$在表达式的开头和结尾,而find 找到第一个匹配项(无论它在字符串中的哪个位置) - 例如,当您可能{{1}时} find()在目标字符串.*bot中,说它robots目标是不正确的......我不完全确定前瞻可能会如何影响这个......

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

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

答案 1 :(得分:0)

String包含区分大小写,因此第一个集合(PHP代码)在使用\ i时将表现为区分大小写。但是java代码的行为会区分大小写。所以行为会有所不同。

因此,如果这是不同的,您将结束转换为特定的字符集,比如包含检查之前的toUpperCase()。

你是在PHP代码中使用正则表达式而不是Java,这有什么特别的原因吗?

此致 Ajai G

答案 2 :(得分:0)

您可以使用嵌入式标记扩展名(?i),因此您应该使用的正则表达式来匹配机器人,机器人,机器人和机器人(?i)^(.*bots?)$这应该与String.matches或Pattern / Matcher一起使用

答案 3 :(得分: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));
   });