Java模式匹配

Java模式匹配,java,php,regex,Java,Php,Regex,我用preg_grep编写了一些php代码,用于以任意顺序匹配任意上下文中存在的几个单词。我正试图将其转换为java,但似乎无法理解 我将关键字转换为正则表达式字符串的php代码是: function createRegexSearch($keywords) { $regex = ''; foreach ($keywords as $key) $regex .= '(?=.*' . $key . ')'; return '/^' . $regex . '/

我用preg_grep编写了一些php代码,用于以任意顺序匹配任意上下文中存在的几个单词。我正试图将其转换为java,但似乎无法理解

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

function createRegexSearch($keywords)
{
    $regex = '';
    foreach ($keywords as $key)
        $regex .= '(?=.*' . $key . ')';
    return '/^' . $regex . '/i';
}
它将创建一个类似于:/^(?=.*bot)/i的正则表达式字符串,它应该与robot、robots、bots等匹配。相同的正则表达式字符串在java中似乎不起作用,这让我感到困惑。目前在java中,我使用contains创建了类似的效果,但更愿意使用regex

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());
}
for(Map.Entry:mKeyList.entrySet())
{
布尔值=真;
字符串val=entry.getValue().toLowerCase();
对于(int i=0;i
字符串包含的内容区分大小写,因此第一个集合(PHP代码)的行为将区分大小写,因为使用了\i。但是java代码的行为将区分大小写。所以在行为上会有差异

因此,如果这是一个差异,则在包含检查之前,将两个字符集的结尾都转换为特定的字符集,比如toUpperCase()

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

问候
Ajai G

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

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


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

您可以使用嵌入的标志扩展名(?i),因此您应该用来匹配机器人、机器人、机器人和机器人的正则表达式是
(?i)^(.*机器人?)$
这应该与String.matches或Pattern/Matcher一起工作。是简单的java库,它可以使用Java8特性模拟一些特性模式匹配

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

你能发布不起作用的java代码吗?是的,我在php中使用的正则表达式代码在java中似乎不起作用。我确实将所有内容的大小写都改为小写,但对于我拥有的数据集来说,似乎需要大约半秒钟的时间,我认为使用正则表达式可以减少这一时间