gpt4 book ai didi

java - 从java中的给定文本中提取阿拉伯语短语

转载 作者:行者123 更新时间:2023-11-29 03:20:50 24 4
gpt4 key购买 nike

你能帮我找到一个包含短语列表的正则表达式,并检查给定文本中是否存在这些短语之一吗?

例子:

如果我在hashSet中有以下的话:

كيف الحال  
إلى أين
أين يوجد
هل من أحد هنا

给定的文本是:كيف الحال أتمنى أن تكون بخير

我想在执行正则表达式之后得到:

我的初始代码:

HashSet<String> QWWords = new HashSet<String>();

QWWords.add("كيف الحال");
QWWords.add("إلى أين");
QWWords.add("أين يوجد");
QWWords.add("هل من أحد هنا");

String s1 = "كيف الحال أتمنى أن تكون بخير";

for (String qp : QWWords) {

Pattern p = Pattern.compile("[\\s" + qp + "\\s]");

Matcher m = p.matcher(s1);

String found = "";

while (m.find()) {
found = m.group();
System.out.println(found);

}

}

最佳答案

[...]character class字符类只能匹配它指定的一个字符。例如像[abc]这样的字符类只能匹配a OR b OR c。因此,如果您只想查找单词 abc,请不要将其包围在 [...] 中。

另一个问题是你使用 \\s 作为单词分隔符,所以在下面的 String 中

String data = "foo foo foo foo";

正则表达式 \\sfoo\\s 将无法匹配第一个 foo 因为前面没有空格
所以它会找到的第一个匹配项是

String data = "foo foo foo foo";
// this one--^^^^^

现在,由于正则表达式在第二个 foo 之后消耗了空间,它不能在下一个匹配中重用它,所以第三个 foo 也将被跳过,因为没有可用空间来匹配在它之前。
您也不会匹配 foo,因为这次 之后没有空格。

要解决此问题,您可以使用 \\b - word boundary它检查它代表的位置是否在字母数字字符和非字母数字字符之间(或字符串的开头/结尾)。

所以代替

Pattern p = Pattern.compile("[\\s" + qp + "\\s]");

使用

Pattern p = Pattern.compile("\\b" + qp + "\\b");

或者更好的是 Tim mentioned

Pattern p = Pattern.compile("\\b" + qp + "\\b",Pattern.UNICODE_CHARACTER_CLASS);

确保 \\b 将在预定义的字母数字类中包含阿拉伯字符。

更新:

我不确定你的话是否可以包含正则表达式元字符,如 { [ + * 等等,以防万一,您还可以添加转义机制以将此类字符更改为文字。

所以

"\\b" + qp + "\\b"

可以变成

"\\b" + Pattern.quote(qp) + "\\b"

关于java - 从java中的给定文本中提取阿拉伯语短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23710720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com