[英]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.