正则表达式使用Java提取阿拉伯语文本

时间:2017-11-02 06:28:56

标签: java regex twitter arabic twitter4j

我想从包含许多非阿拉伯文本和元素的文件中提取阿拉伯语文本,例如(英语,表情符号,数字等等),使用正则表达式,我在这里找到了许多教程,它们可以工作!但问题是我得到Ex的附加信件: String text = "123 اهلين و سهلين" 应用正则表达式后

output: "اهلينوسهلين"

The output I want: "اهلين و سهلين"

我尝试了很多方法来解决这个问题,包括: "\\p{InArabic}+(?:\\s+\\p{InArabic}+)*" "(?:[\\u0600-\\u06FF]+(?:\\s+[\\u0600-\\u06FF]+)*)" "^[\\p\\{Arabic\\}\\s]+$" 但是我无法得到我需要的结果,即使其他人根据他们的问题能够找到与我需要的相同的输出结构使用这些正则表达式。

我的代码:

    String regex = "\\p{InArabic}+";
    String outString;
    String cleaned = "";
    Scanner in = new Scanner(new FileReader(path+"tweets.txt"));
    StringBuilder sb = new StringBuilder();
    while(in.hasNext()) {
        sb.append(in.next());
    }
    in.close();
    outString = sb.toString();
    final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | 
    Pattern.UNICODE_CHARACTER_CLASS);
    final Matcher matcher = pattern.matcher(outString);
    while (matcher.find()) {
       cleaned = cleaned +" "+ matcher.group();
    }

我在另一个文本文件上运行我的代码并且它以正确的格式显示正确的输出,所以我认为问题在于我试图运行代码的文本文件,这是检索到的推文使用twitter4j所以可能存在问题吗?

3 个答案:

答案 0 :(得分:1)

这会在您的问题中输出所需的文字:

text.replaceAll("[^\\p{InARABIC} ]", "").trim()

这会将否定字符POSIX类用于阿拉伯字母,并添加对trim()的调用。

如果您绝对必须使用单个正则表达式(即不调用trim()):

text.replaceAll("^[\\P{InARABIC}\\d ]*|[\\P{InARABIC} ]*$", "")

此代码:

System.out.println(" اهلين و سهلين 123".replaceAll("[^\\p{InARABIC} ]", "").trim()

输出:

اهلين و سهلين

答案 1 :(得分:0)

尝试使用此正则表达式[^\u0600-\u06FF\\s]+,这意味着将非阿拉伯字符或空格替换为空:

String text = "123 اهلين و سهلين, Welcome, Bienvenue, Hola";
text = text.replaceAll("[^\u0600-\u06FF\\s]+", "");

输出

اهلين و سهلين

您最后还可以使用trim()来删除开头和结尾的空间:

text = text.replaceAll("[^\u0600-\u06FF\\s]+", "").trim();

Code demo

答案 2 :(得分:0)

public class HelloWorld
{

     public static void main(String []args)
     {
        System.out.println("Hello World");
        System.out.println (containsArabicLetters("بسيب سيبيس سيبسيبسي سشسشس"));
     }

     public static boolean containsArabicLetters(String text)
     {
        
        char[] ch1 = text.replaceAll(" ", "").toCharArray();
        
        for (char c:ch1)
        {
            if (c >= 0x600 && c <= 0x6ff)
                continue;
            if (c >= 0x750 && c <= 0x77f)
                continue;
            if (c >= 0xfb50 && c <= 0xfc3f)
                continue;
            if (c >= 0xfe70 && c <= 0xfefc)
                continue;
            else
                return false;
        }
        return true;
    }
}