【问题标题】:Java Regex: Allow only certain characters, but don't allow certain characters to begin the string?Java Regex:只允许某些字符,但不允许某些字符开始字符串?
【发布时间】:2016-11-04 06:03:09
【问题描述】:

我正在摆弄 Java 正则表达式,我正在尝试提出一种模式,它允许在其他任何地方使用特定字符集,但它不能以允许集中的特定字符开头。

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

【问题讨论】:

  • [A-WY] 怎么样?

标签: java regex string


【解决方案1】:

你可以使用这个正则表达式:

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

一般要排除某些字符,您还可以使用否定前瞻:

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

(?![XZ]) 是否定前瞻,以在开始时禁止 XZ

【讨论】:

  • 如果允许的字符正则表达式是hyuuuuge,我还需要这样重复吗?有没有办法排除这两个字符?
  • 检查我的更新答案以在开始时使用否定前瞻排除某些字符。
  • 谢谢!你答案的最后一部分恰到好处。会尽快接受的。
【解决方案2】:

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 支持这一点,我会感到惊讶。他们甚至不支持lookbehinds :(。这是一个很好的答案
  • 虽然文档称其为减法,但它更像是对交集功能的滥用。 .net 和 pythons 正则表达式模块也支持减法。 @TheLostMind JS 不支持这一点,标准 C++、Boost、Python re 或 PCRE 也不支持。
  • @SebastianProske - 是的,许多语言不支持这一点(ajb 已明确说明这一点):)
猜你喜欢
  • 2010-12-09
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多