2016-07-22 43 views
0

我需要验证该用户类型只有英文文本。 所以它可以是带有标点符号的拉丁字母。 现在我写的正则表达式如下:Hibernate @Pattern ASCII符号的正则表达式验证器

@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); 
} 

回答

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 &儒略Lettner从https://stackoverflow.com/a/3585791/1245478

选项2个引号ARNE从https://stackoverflow.com/a/3585284/1245478

选项3个引号从https://stackoverflow.com/a/3585247/1245478

选项RealHowTo 4个引号科林d从https://stackoverflow.com/a/3585089/1245478

+0

好吧,但你知道如何通过休眠来进行验证吗? –

+1

尝试使用我的选项2中的正则表达式模式,而不使用@Pattern中不那么长的非优雅正则表达式,您不喜欢 – NickNo