正则表达式下划线分隔模式匹配

时间:2017-06-16 06:57:42

标签: regex

嗨我正在努力让正则表达式适合模式匹配。

我基本上想使用正则表达式来匹配以下模式。

[anyCharacters]_[anyCharacters]_[anyCharacters]_[anyCharacters]_[1or2]

例如,下面的字符串应该与上面的模式匹配。 AA_B_D_ test-adf123_1

我尝试了下面的正则表达式但不起作用.....

^[.]+_[.]+_[.]+_[.]+_(1|2)

3 个答案:

答案 0 :(得分:2)

.匹配任何字符(一次)_包含

.*匹配任何字符(最大序列)(包括_

[.]+仅匹配.个字符(至少一个)(最大序列)

[^_]+匹配除_以外的任何字符(至少一个)(最大序列)

.*?匹配任何字符(最短序列)

你可能需要最后两个中的一个。

^[^_]+_[^_]+_[^_]+_[^_]+_(1|2)

^(.*?_){4}[12]

.*?的问题在于它可以回溯并匹配

one_two_three_four_five_1

最短的是

^([^_]+_){4}[12]

答案 1 :(得分:1)

使用仅与点符号匹配的[^_] negated character class而不是[.]

^[^_]+_[^_]+_[^_]+_[^_]+_[12]

如果模式必须与整个字符串匹配,请添加$

^[^_]+_[^_]+_[^_]+_[^_]+_[12]$

另外,您可以使用limiting quantifier

缩短一点
^[^_]+(?:_[^_]+){3}_[12]$

请参阅regex demo

请注意,[12]是匹配单个字符的更好方法,它将匹配12。分组构造,如(...)(或(?:...),非捕获变体)  匹配多字符值时应使用。

模式详情

  • ^ - 字符串开头
  • [^_]+ - 除_
  • 以外的1个或多个字符
  • (?:_[^_]+){3} - 出现3次:
    • _ - 下划线
    • [^_]+ - 除_
    • 以外的1个或多个字符
  • _ - 下划线
  • [12] - 12
  • $ - 字符串结束。

答案 2 :(得分:1)

尝试

^(.+_)+(1|2)$

如果要指定出现次数:

^(.+_){4}(1|2)$