2016-07-22 22 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