如何使用匹配器来了解是否存在非想要的角色?

时间:2016-12-19 22:08:32

标签: java regex

我有这个问题。

我正在阅读如何创建过滤器以便稍后在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个字符......

1 个答案:

答案 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锚点。