我在摆弄Java正则表达式,我试图想出一个模式,允许在其他地方的某个字符集,但它不能以允许的集合中的某些字符开始。Java正则表达式:只允许某些字符,但不允许某些字符开始字符串?
例如,假设允许的字符是从A到Z,但是字符串不能以X或Z开头,我该怎么做?我想出了^[XZ][^A-Z]+
,尽管它不起作用,但它允许字符串以不在集合中的其他字母(例如标点符号)开头。
我在摆弄Java正则表达式,我试图想出一个模式,允许在其他地方的某个字符集,但它不能以允许的集合中的某些字符开始。Java正则表达式:只允许某些字符,但不允许某些字符开始字符串?
例如,假设允许的字符是从A到Z,但是字符串不能以X或Z开头,我该怎么做?我想出了^[XZ][^A-Z]+
,尽管它不起作用,但它允许字符串以不在集合中的其他字母(例如标点符号)开头。
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没有,而且我实际上并不知道另一种语言,但我没有检查过。
如果JS支持这个,我会感到惊讶。他们甚至不支持向后看:(。这是一个很好的答案 – TheLostMind
尽管文档称它为减法,但它更多的是交叉特性的滥用,也支持.net和pythons正则表达式模块中的减法。@TheLostMind JS不支持这个,Standard C++,Boost,Python re或PCRE都不支持。 –
@SebastianProske - 是的,许多语言都不支持这个(ajb已经明确声明了这一点:)) – TheLostMind
'[A-WY]'怎么样? – ajb