我需要验证该用户仅键入英文文本。 所以它可以是带有一些标点符号的拉丁字母。 现在我写下面的正则表达式:
@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);
}
答案 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 中的RealHowTo 中的Colin D.答案 1 :(得分:0)