嗨我正在努力让正则表达式适合模式匹配。
我基本上想使用正则表达式来匹配以下模式。
[anyCharacters]_[anyCharacters]_[anyCharacters]_[anyCharacters]_[1or2]
例如,下面的字符串应该与上面的模式匹配。 AA_B_D_ test-adf123_1
我尝试了下面的正则表达式但不起作用.....
^[.]+_[.]+_[.]+_[.]+_(1|2)
答案 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]
是匹配单个字符的更好方法,它将匹配1
或2
。分组构造,如(...)
(或(?:...)
,非捕获变体)
匹配多字符值时应使用。
模式详情:
^
- 字符串开头[^_]+
- 除_
(?:_[^_]+){3}
- 出现3次:
_
- 下划线[^_]+
- 除_
_
- 下划线[12]
- 1
或2
$
- 字符串结束。答案 2 :(得分:1)
尝试
^(.+_)+(1|2)$
如果要指定出现次数:
^(.+_){4}(1|2)$