【问题标题】:Check String whether it contains only Latin characters?检查字符串是否只包含拉丁字符?
【发布时间】:2010-12-27 01:58:28
【问题描述】:

您好,

我正在开发 GWT 应用程序,用户可以在其中输入他的日语详细信息。 但“用户名”和“密码”只能包含英文字符(拉丁字母)。 如何为此验证字符串?

【问题讨论】:

  • 有英文字符?!?!我认为英语中的字符来自拉丁字母。
  • 好吧,如果他指的是 ascii 字符,那么我会称其为英文字符.. 或美国字符。

标签: java string validation gwt


【解决方案1】:

您可以为此使用String#matches() 和一点regex。拉丁字符被\w覆盖。

所以应该这样做:

boolean valid = input.matches("\\w+");

顺便说一句,这也包括数字和下划线_。不确定这是否有害。否则,您可以改用[A-Za-z]+

如果您还想覆盖diacritical characters(ä、é、ò 等,根据定义也是拉丁字符),那么您需要先对它们进行规范化,并在匹配之前去掉变音符号,仅仅是因为没有涵盖变音符号的 (documented) 正则表达式。

String clean = Normalizer.normalize(input, Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
boolean valid = clean.matches("\\w+");

更新:Java 中有一个未记录的正则表达式,它也涵盖了变音符号,\p{L}

boolean valid = input.matches("\\p{L}+");

以上适用于 Java 1.6。

【讨论】:

  • Drat,你是对的。我发誓多年来我从未在 API 文档中看到过它。您是 Sun API 文档的维护者吗?
  • 不,但我阅读该特定 JavaDoc 页面的次数比我愿意承认的要多;-)
  • Unicode 字母类别\p{L} 也涵盖了很多非拉丁字母。
  • 我想你想要\p{script=Latin}
【解决方案2】:

可能有更好的方法,但您可以使用您认为可接受的字符加载集合,然后根据该集合检查用户名/密码字段中的每个字符。

伪:


foreach (character in username)
{
    if !allowedCharacters.contains(character)
    {
        throw exception
    }
}

【讨论】:

    【解决方案3】:

    对于这么简单的事情,我会使用正则表达式。

    private static final Pattern p = Pattern.compile("\\p{Alpha}+");
    
    static boolean isValid(String input) {
      Matcher m = p.matcher(input);
      return m.matches();
    }
    

    还有其他预定义的类,例如 \w,可能效果更好。

    【讨论】:

      【解决方案4】:
      public static boolean isValidISOLatin1 (String s) {
          return Charset.forName("US-ASCII").newEncoder().canEncode(s);
      } // or "ISO-8859-1" for ISO Latin 1
      

      有关参考,请参阅documentation on Charset

      【讨论】:

      • 我不会使用它,因为它允许输入包含空格和控制字符(包括 U+0000),这几乎可以肯定在用户名中不受欢迎。
      【解决方案5】:

      我成功使用了user232624、Joachim SauerTvaroh的答案组合:

      static CharsetEncoder asciiEncoder = Charset.forName("US-ASCII"); // or "ISO-8859-1" for ISO Latin 1
      
      boolean isValid(String input) {    
          return Character.isLetter(ch) && asciiEncoder.canEncode(username);
      }
      

      【讨论】:

        【解决方案6】:

        有我的解决方案,效果很好

        public static boolean isStringContainsLatinCharactersOnly(final String iStringToCheck)
        {
            return iStringToCheck.matches("^[a-zA-Z0-9.]+$");
        }
        

        【讨论】:

          猜你喜欢
          • 2016-05-19
          • 2017-12-16
          • 2011-07-11
          • 2017-07-04
          • 1970-01-01
          • 2013-03-08
          • 1970-01-01
          • 2011-11-09
          • 2013-05-18
          相关资源
          最近更新 更多