java - 从字符串中提取阿拉伯语单词(不是语义阿拉伯语短语)

标签 java regex locale

String description="Big data is a broad term for data sets so large or complex that traditional data processing applications are inadequate. البيانات الضخمة هي عبارة عن مجموعة من مجموعة البيانات الضخمة جداً والمعقدة لدرجة أنه يُصبح من الصعب معالجتها باستخدام أداة واحدة فقط من أدوات إدارة قواعد البيانات أو باستخدام تطبيقات معالجة البيانات التقليدية. "

我需要一个正则表达式来仅提取阿拉伯语单词。

我检查this ticket但是,这是一张 PHP 票,而我需要 JAVA 正则表达式。

import java.util.regex.*;
Pattern p = Pattern.compile("#(?:[\x{0600}-\x{06FF}]+(?:\s+[\x{0600}-\x{06FF}]+)*)#u");
print(p.matcher(description).group(1));

它会引发错误。

最佳答案

要查找一个或多个阿拉伯字符,您可以使用 \p{InArabic}+

Pattern documentation 没有直接提到这个类,但它为我们提供了有关的信息

Classes for Unicode scripts, blocks, categories and binary properties
\p{IsLatin} A Latin script character (script)
\p{InGreek} A character in the Greek block (block)
\p{Lu} An uppercase letter (category)
\p{IsAlphabetic} An alphabetic character (binary property)

并受到\p{InGreek}示例的鼓励,我们可以开始阅读有关 block 的内容,以发现

Blocks are specified with the prefix In, as in InMongolian, or by using the keyword block (or its short form blk) as in block=Mongolian or blk=Mongolian.

The block names supported by Pattern are the valid block names accepted and defined by UnicodeBlock.forName.

最后一句话对我们来说最重要。现在我们需要看看 UnicodeBlocks 是否应该支持阿拉伯字符组。所以我们访问它的documentation我们在哪里可以找到字段

public static final Character.UnicodeBlock ARABIC

这表明支持阿拉伯字符 block 。

<小时/>

因此,要查找单个阿拉伯单词,您的代码可以如下所示:

String description="Big data is a broad term for data sets so large or complex that traditional data processing applications are inadequate. البيانات الضخمة هي عبارة عن مجموعة من مجموعة البيانات الضخمة جداً والمعقدة لدرجة أنه يُصبح من الصعب معالجتها باستخدام أداة واحدة فقط من أدوات إدارة قواعد البيانات أو باستخدام تطبيقات معالجة البيانات التقليدية. ";
Pattern p = Pattern.compile("\\p{InArabic}+";
Matcher m = p.matcher(description);
while(m.find()){
    System.out.println(m.group());
}

输出:

البيانات
الضخمة
هي
.
.
.
البيانات
التقليدية

如果您想查找由一个或多个空格分隔的阿拉伯单词组,您可以使用此模式

Pattern p = Pattern.compile("\\p{InArabic}+(?:\\s+\\p{InArabic}+)*");

您可能想知道 * - 代表零个或多个,+ - 代表一个或多个

所以这个正则表达式意味着

\\p{InArabic}+     # one or more Arabic characters (Arabic word)
(?:                # non-capturing group storing:
  \\s+             # one or more whitespace characters
  \\p{InArabic}+   # with another Arabic word after it
)*                 # zero or more times

关于java - 从字符串中提取阿拉伯语单词(不是语义阿拉伯语短语),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31852871/

相关文章:

java - spring-cloud和ribbon能否实现基于DNS的负载均衡?

java - 推土机 - 测绘集合

c - Linux 中是否有 API 可以从语言环境中获取完整的语言名称?

java - JavaScript 中依赖于语言环境的字符串排序/比较

安卓选择货币

java - 如何从一个jframe到另一个jframe访问jtextarea

java - 无法将字符串类型的数组列表转换为整数数组列表并将新列表传递给方法

java - 如何在 Java 正则表达式中包含命名捕获组?

javascript - 如何使用正则表达式从字符串中获取浮点值?

javascript - js 正则表达式 - 检查数字并可选择以/结尾