2016-11-04 488 views
1

我在摆弄Java正则表达式,我试图想出一个模式,允许在其他地方的某个字符集,但它不能以允许的集合中的某些字符开始。Java正则表达式:只允许某些字符,但不允许某些字符开始字符串?

例如,假设允许的字符是从A到Z,但是字符串不能以X或Z开头,我该怎么做?我想出了^[XZ][^A-Z]+,尽管它不起作用,但它允许字符串以不在集合中的其他字母(例如标点符号)开头。

+0

'[A-WY]'怎么样? – ajb

回答

5

你可以使用这个表达式:

^[A-WY][A-Z]*$ 
  • ^[A-WY]确保第一个字符是A-WY
  • [A-Z]*$将匹配0或以上的大写英文字母

的一般排除某些字符,你可以也可以使用负前瞻:

^(?![XZ])[A-Z]+$ 

(?![XZ])为负先行不允许XZ在启动。

+0

如果允许的字符正则表达式是hyuuuuge,那么我还需要像这样重复吗?有没有办法排除这两个字符? – manabreak

+0

检查我的更新答案,在开始时使用负向预测排除某些字符。 – anubhava

+0

谢谢!你答案的最后部分就是现场。将尽快接受。 – manabreak

1

Java正则表达式支持字符类中的减法;看到http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html,这显示了这些作为例子:

[a-z&&[^bc]] a through z, except for b and c: [ad-z] (subtraction) 
[a-z&&[^m-p]] a through z, and not m through p: [a-lq-z](subtraction) 

所以你可以说

[A-Z&&[^XZ]] 

意味着除了X或Z这真的是这里不需要任何大写ASCII字母,但如果你正在使用像Posix字符类这样的大类,它可能会更有用。

警告:并非所有语言在正则表达式中都支持此构造。我很确定C++和Javascript没有,而且我实际上并不知道另一种语言,但我没有检查过。

+2

如果JS支持这个,我会感到惊讶。他们甚至不支持向后看:(。这是一个很好的答案 – TheLostMind

+0

尽管文档称它为减法,但它更多的是交叉特性的滥用,也支持.net和pythons正则表达式模块中的减法。@TheLostMind JS不支持这个,Standard C++,Boost,Python re或PCRE都不支持。 –

+0

@SebastianProske - 是的,许多语言都不支持这个(ajb已经明确声明了这一点:)) – TheLostMind

相关问题