从Java中的给定文本中提取阿拉伯语短语
您能帮我找到一个包含短语列表的正则表达式,请检查给定文本中是否存在这些短语之一?
例:
如果我有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);
}
}
回答:
[...]
是字符类,字符类只能匹配它指定的一个字符。例如,像字符类[abc]
只能匹配a
OR b
OR
c
。因此,如果您只想查找单词,abc
请不要将其括起来[...]
。
另一个问题是您\\s
用作单词分隔符,因此在下面的字符串中
String data = "foo foo foo foo";
正则表达式\\sfoo\\s
将无法首先匹配,foo
因为 之前没有空格 。
因此,它将找到第一个匹配项
String data = "foo foo foo foo";// this one--^^^^^
现在,由于正则表达式在第二秒后就消耗了空间,foo
因此无法在下一场比赛中重复使用它,因此第三次foo
也将被跳过,因为之前没有可用的空间来匹配。
您也不会匹配,foo
因为这次 之后 没有空格了。
要解决此问题,您可以使用\\b
- 单词边界,它检查它代表的位置是否在字母数字字符与非字母数字字符之间(或字符串的开始/结尾)。
所以代替
Pattern p = Pattern.compile("[\\s" + qp + "\\s]");
用
Pattern p = Pattern.compile("\\b" + qp + "\\b");Pattern p = Pattern.compile("\\b" + qp + "\\b",Pattern.UNICODE_CHARACTER_CLASS);
确保\\b
在预定义的字母数字类中包含阿拉伯字符。
更新:
我不确定您的单词是否可以包含正则表达式元字符(例如){
[
+
*
,以防万一,您还可以添加转义机制以将此类字符转换为文字。
所以
"\\b" + qp + "\\b"
可以变成
"\\b" + Pattern.quote(qp) + "\\b"
以上是 从Java中的给定文本中提取阿拉伯语短语 的全部内容, 来源链接: utcz.com/qa/400368.html