检查字符是否属于拉丁字母表?

6

在继续处理之前,我需要测试字符是字母还是空格。因此,i

    for (Character c : take.toCharArray()) {
        if (!(Character.isLetter(c) || Character.isSpaceChar(c)))
            continue;

        data.append(c);

一旦我检查了数据,发现其中包含看起来类似于非拉丁字母表外字符的Unicode表示形式。我该如何修改上述代码来加强条件,仅接受落在 [a-z][A-Z] 范围内的字母字符?
正则表达式是否是可行的方法,还是有更好(更快)的方法?

1
等等,为什么你认为 "é" 不是一个字母?通常人们都在寻找使他们的代码更好地处理国际输入的方法,而不是更糟糕的方法... - Borealid
@Borealid,就我的情况而言,控制字符是一个奇怪的问题,我目前正在进一步调查。é确实是一个有效的字符,但对于我的程序来说,它不应该存在。 - James Raitsev
1
实现此操作的正则表达式是使用\p{sc=Latin}检查拉丁文属性。 - tchrist
3个回答

18

如果你只想处理这52个字符,那么就只处理它们:

public static boolean isLatinLetter(char c) {
    return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
}

4
如果您只想删除非ASCII字母字符,那么一个快速的方法是使用String.replaceAll()和正则表达式:
s.replaceAll("[^a-zA-Z]", "")

不过,无法对性能与逐个字符扫描并附加到StringBuilder进行比较。


在我的测试中,逐个字符地处理似乎要快大约30%。但这当然是一种有效的建议和方法。谢谢。 - James Raitsev
2
我很好奇使用s.replaceAll("[^a-zA-Z]+", "")s.replaceAll("[^a-zA-Z]*", "")的结果。 - Samuel Edwin Ward
2
@SamuelEdwinWard 哇。比 [^a-zA-Z]+ 快了一倍,比按字符的更快。 - James Raitsev

1
我会使用你指定的正则表达式来完成这个任务。它易于阅读,并且应该非常快速(特别是如果你静态分配它)。

您能提供一个正确的示例吗?我想看看哪种方法更快。 - James Raitsev
现在这个地方已经很晚了,所以如果你想让代码编译通过的话,恐怕你得等一下了 :) - Samuel Edwin Ward
但是,顺便说一句,你现在可能过于关注速度了。这肯定不是你正在执行的最慢操作吧?优化未来开发人员(也许是你自己!)尝试理解这段代码的时间可能更加高效。 - Samuel Edwin Ward

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