我有这个问题。
我正在阅读如何创建过滤器以便稍后在java中的pattern.match
中使用它们
public Pattern pattern = Pattern.compile("[A-Z]\\d{5,9}|\\d{9}", Pattern.CASE_INSENSITIVE);
我的问题是......
我希望字符串以字符开头(即[A-Z])
,然后接收一些数字和字母数字字符(包括一些
像&这样的特殊字符。 '等等)
问题在于,而不是允许&和'和所有其他人,我想否认一些(允许其他任何东西)。
所以,我想拒绝例如%
和*
并且不在乎我是否在字符串中得到&
或'
。
我想先接受一个字母字符,并在所有字符串中拒绝%, ', * , =
。
有没有办法在pattern.match中做到这一点?
实施例
Asdafsd&2 = true
asdwwe%as = false
问题是我只知道我要拒绝的几个角色......我的意思是,我必须有0个巧合。字符串应少于15个字符......
答案 0 :(得分:1)
我希望字符串以字符开头(即[A-Z]),然后接收一些数字和字母数字字符(包括一些特殊字符,如&。'等等)
所以,如果你要选择这条路径,你会使用像
这样的东西public Pattern pattern = Pattern.compile("[A-Z][\\p{Alnum}&']*", Pattern.CASE_INSENSITIVE);
其中[A-Z]
匹配ASCII字母,[\\p{Alnum}&']*
匹配0 +字母数字字符,或&
或'
。而且你必须添加更多你允许的特殊字符。如果您想要允许几乎所有这些特殊字符,那么该列表可能会变得非常大。
我的问题是,而不是允许&和'和其他所有人,我想否认一些(允许其他任何事情)。
然后,您可以依赖否定字符类:
Pattern.compile("[A-Z][^%*]*", Pattern.CASE_INSENSITIVE)
^^^^^^
如果您需要匹配以ASCII字母([A-Z]
)开头的字符串,然后匹配除%
和*
以外的零个或多个字符([^%*]*
)
详细了解Negated Character Classes here。
请参阅此Java demo:
String pat = "(?i)[A-Z][^%'*=]{0,13}";
System.out.println("Asdafsd&".matches(pat)); // = true
System.out.println("asdwwe%as".matches(pat)); // = false
下面,
(?i)
- 不区分大小写的修饰符[A-Z]
- ASCII字母[^%'*=]{0,13}
- 0到13次出现%
,'
,*
和=
以外的字符。由于String#matches
需要完整字符串匹配,因此不需要^
/ \A
和$
/ \z
锚点。