2017-06-16 507 views
1

嗨,我正在努力获得正确的模式匹配的正则表达式。正则表达式下划线分隔模式匹配

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

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

例如,下面的字符串应该匹配上面的模式。 AA_B_D_测试adf123_1

我想下面的正则表达式,但不工作.....

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

回答

1

尝试

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

如果你想指定的出现次数:

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

的'AA_B_D_测试adf123_1'样本串没有'['和']'。 –

1

使用[^_]negated character class而不是[.],只有匹配的点符号:

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

如果图案必须匹配整个字符串,请添加$

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

此外,您可能有点用limiting quantifier缩短:

^[^_]+(?:_[^_]+){3}_[12]$ 

regex demo

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

图案的详细资料

  • ^ - 3出现的 - 1以上字符比_
  • (?:_[^_]+){3}其他 - 串
  • [^_]+的开始:
    • _ - 下划线
    • [^_]+ - 1以上字符比_
  • _其他 - 下划线
  • [12] - 12
  • $ - 字符串的结尾。
1

.(一次)_包括

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

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

匹配任何字符

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

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

您可能需要过去的两种之一。

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

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

.*?的问题是,它可以走回头路,也符合

one_two_three_four_five_1 

最短的是

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