正则表达式匹配多个字符

时间:2019-01-29 06:03:27

标签: regex

我想编写一个正则表达式模式,以匹配以“ Z”开头且不包含接下来的2个字符“ IU”和其他任何字符的字符串。

我正在使用此模式,但它不起作用 Z [^(IU)] +。* $

  1. ZISADR-应该匹配
  2. ZIUSADR-不匹配
  3. ZDDDDR-应该匹配

2 个答案:

答案 0 :(得分:1)

当您要否定字符串中的某些字符时,可以使用字符类,但是当您要否定特定序列中的多个字符时,则需要使用负向查找,并像这样编写正则表达式,

^Z(?!IU).*$

Demo

还请注意,您的第一个单词ZISADR将与之匹配,因为Z后没有IU

您的正则表达式Z[^(IU)]+.*$将匹配以Z开头的字符,而[^(IU)]+字符类将匹配( I U以外的任何字符并且)后面再加上.*一次或多次,则表示它将匹配零次或多次的任何字符,这不是您想要的行为。

编辑:提供解决方案

基于非前瞻性的解决方案是使用此正则表达式,

^Z(?:I[^U]|[^I]U|[^I][^U]).*$

此正则表达式具有三个主要替代形式,其中包含了涵盖所有必要的情况。

  • I[^U]-确保第二个字符为I,则第三个字符不应为U
  • [^I]U-确保第三个字符为U,则第二个字符不应为I
  • [^I][^U]-确保第二个和第三个字符不应同时为IU

Demo non-look ahead based solution

答案 1 :(得分:1)

尝试此正则表达式:

^Z(?:I[^U]|[^I]).*$

Click for Demo

说明:

  • ^-断言行的开头
  • Z-匹配Z
  • I[^U]-匹配I,后跟不是U的任何字符
  • |-或
  • [^I]-匹配不是I的任何字符
  • .*-匹配0+次出现的不是换行符的任何字符
  • $-声明行的结尾