【问题标题】:Checking if character is a part of Latin alphabet?检查字符是否是拉丁字母的一部分?
【发布时间】:2012-02-06 02:09:15
【问题描述】:

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

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

        data.append(c);

检查数据后,我发现它包含的字符看起来像是拉丁字母表之外字符的 unicode 表示。如何修改上述代码以收紧我的条件,只接受 [a-z][A-Z] 范围内的字母字符?

正则表达式是一种方法,还是有更好(更快)的方法?

【问题讨论】:

  • 等等,为什么你认为“é”不是字母?通常人们正在寻找方法让他们的代码处理国际输入更好,而不是更糟...
  • @Borealid,在我的情况下,控制字符是一个奇怪的东西,我目前正在进一步调查。 é 肯定是一个有效字符,就我的程序而言,它不应该存在。
  • 执行此操作的正则表达式是使用 \p{sc=Latin} 检查拉丁脚本属性。

标签: java


【解决方案1】:

如果您只想处理这 52 个字符,则只需处理它们:

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

【讨论】:

    【解决方案2】:

    如果您只想去除非 ASCII 字母字符,那么一种快速的方法是使用 String.replaceAll() 和 Regex:

    s.replaceAll("[^a-zA-Z]", "")
    

    不过,不能说性能与逐个字符扫描并附加到StringBuilder

    【讨论】:

    • 在我的测试中显示,一次 1 个字符的速度大约快 30%。但肯定是一个有效的建议和方法。谢谢
    • 我很想看看s.replaceAll("[^a-zA-Z]+", "")s.replaceAll("[^a-zA-Z]*", "") 的结果。
    • @SamuelEdwinWard 哇。比 [^a-zA-Z]+ 快一倍,比字符快一倍
    【解决方案3】:

    我会使用您为此指定的正则表达式。它易于阅读并且应该非常快速(特别是如果您静态分配它)。

    【讨论】:

    • 您能否提供一个正确的示例?我想看看哪个更快。
    • 在这个地方已经很晚了,所以恐怕你必须等待代码,特别是如果你想编译它:)
    • 但是,顺便说一句,此时您可能会过度关注速度。这肯定不是您执行的最慢的操作吗?优化未来开发人员(可能是你!)尝试理解这段代码的时间可能会更有效。
    猜你喜欢
    • 2016-05-19
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2022-01-15
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多