如何检测一个字符串中是否至少包含特定语言的一个字符?

3
我正在创建一个Android应用程序,其中有一个字符串。我想检查这个字符串是否包含至少一个属于印地语语言的字符。
无论该字符串使用哪种语言,只要它有至少一个印地语字符,就需要调用我的函数。
其中一种方法是将字符串的每个字符与所有印地语语言的Unicode进行比较。但这样做会太耗时吗?例如,50个字符的字符串和50个Unicode将导致2500个比较。
什么是最优解决方案?

你想检查输入语言是否为英语吗?还是只想检查它不是英语? - Shaishav Jogani
不。我有一个字符串。我想检查它是否包含任何属于印地语的字符。其余的字符串可以是任何东西。 - Srujan Barai
1
这里我找到了一个可以打印所有印地语字符的代码。 https://milindjagre.wordpress.com/2014/06/30/how-to-print-hindi-characters-using-java/comment-page-1/所以,如果你遍历整个输入字符串并检查字符是否在2309和2360之间,你可以用2n次比较完成任务(其中n是字符串长度)。 - steveman
3个回答

7

I think of these two methods

Method 1

 boolean isHindi = false;
 for (char c: myString.toCharArray()) {
     if (Character.UnicodeBlock.of(c) == Character.UnicodeBlock.DEVANAGARI) {
         isHindi = true;
         break;
     }
 }

方法2

    boolean isHindi = false;
    for (int k = 0; k < Character.codePointCount(myString, 0, myString.length()); k++) {
        int c = myString.codePointAt(k);
        if (c >= 0x0900 && c <= 0x097F) {  //Hindi uni-codes are within this range
            isHindi = true;
            break;
        }
    }

我不明白 Character.UnicodeBlock.DEVANAGARI 这一部分。如果我想检查其他语言呢?不确定如何更改它,如果我必须对其他语言执行相同的操作会怎样。好吧,我猜你的第二种方法对我更直观。 - Srujan Barai
几乎所有主要语言都包含在Character.UnicodeBlock集合中,例如阿拉伯语、古吉拉特语、孟加拉语、希伯来语等。您可以使用||(or)来检查多种语言。请参考:https://docs.oracle.com/javase/7/docs/api/java/lang/Character.UnicodeBlock.html - Shaishav Jogani
明白了!谢谢,原来你也是古吉拉特人。不错呀。 - Srujan Barai

0

您也可以进行正则表达式匹配。以下是示例代码

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HindiDetctionDemo {
    public static void main(String args[]) {
        Pattern hindiFirstCharMatchPattern = Pattern.compile("[\\u0900-\\u097F].*");
        Matcher hindiFirstCharMatcher = hindiFirstCharMatchPattern.matcher("ok ");
        if(hindiFirstCharMatcher.matches()) {
            System.out.println("found");
        } else {
            System.out.println("could not find.");
        }
    }
}

关于正则表达式的说明

[\u0900-\u097F] 是匹配印地语字符的模式。

添加 .* 以便在第一次匹配后停止匹配。


0
如果您正在使用Java-8,您可以这样做:
boolean isHindi = 
    myString.chars().anyMatch(c -> Character.UnicodeBlock.of(c) == Character.UnicodeBlock.DEVANAGARI);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接