用于ASCII符号的Hibernate @Pattern regexp验证器

时间:2016-07-22 15:22:14

标签: java hibernate validation

我需要验证该用户仅键入英文文本。 所以它可以是带有一些标点符号的拉丁字母。 现在我写下面的正则表达式:

@NotEmpty
@Pattern(regexp = "^[ \\w \\d \\s \\. \\& \\+ \\- \\, \\! \\@ \\# \\$ \\% \\^ \\* \\( \\) \\; \\\\ \\/ \\| \\< \\> \\\" \\' \\? \\= \\: \\[ \\] ]*$")
private String str;

它工作正常。
但我想更优雅的方式:我想验证我的字符串只包含ASCII符号。我可以使用一些特殊的注释或参数吗?或者我需要为此编写我的自定义验证器? (在这种情况下,你可以帮我举例说明。)

我想要类似的东西:

static CharsetEncoder asciiEncoder = Charset.forName("US-ASCII"); // or "ISO-8859-1" for ISO Latin 1

boolean isValid(String input) {    
    return asciiEncoder.canEncode(input);
}

2 个答案:

答案 0 :(得分:1)

选项1:

Java中的字符串始终编码为UTF-16,其中ASCII字符集包含在0-127范围内。因此,任何非ASCII字符都不会包含0到127之间的数字。

str.chars().allMatch(c -> c < 128);

选项2:正则表达式

public class Main {
    public static void main(String[] args) {
        char nonAscii = 0x00FF;
        String asciiText = "Day";
        String nonAsciiText = "Night " + nonAscii;
        System.out.println(asciiText.matches("\\A\\p{ASCII}*\\z"));
        System.out.println(nonAsciiText.matches("\\A\\p{ASCII}*\\z"));
    }
}

选项3:使用java.nio.charset.Charset

import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

public class StringUtils {

  static CharsetEncoder asciiEncoder = 
      StandardCharsets.US_ASCII.newEncoder(); 

  public static boolean isPureAscii(String v) {
    return asciiEncoder.canEncode(v);
  }

  public static void main (String args[])
    throws Exception {

     String test = "Réal";
     System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));
     test = "Real";
     System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test));
  }
}

选项4:使用番石榴,第三方

boolean isAscii = CharMatcher.ascii(someString);

参考:

选项1引用JeremyP&amp; Julian Lettner来自https://stackoverflow.com/a/3585791/1245478

选项2引用https://stackoverflow.com/a/3585284/1245478

中的Arne

选项3引用https://stackoverflow.com/a/3585247/1245478

中的RealHowTo

选项4引用https://stackoverflow.com/a/3585089/1245478

中的Colin D.

答案 1 :(得分:0)