不允许在开始时使用空格(_)或在单词之间使用两个以上

时间:2018-01-21 14:00:03

标签: php regex

我有这个正则表达式the _ is the whitespace

^([a-z]{4}+)?_([A-Z]{4}+)?_(\d{4}+)?$

允许alpha_BETA_1920,我希望它也允许以下值

alpha

BETA

1920

alpha_BETA

alpha_1920

BETA_1920

问题是_是静态的,因此上面的所有值都是false,而我的RegEx将下一个false值视为true

alpha__

_BETA_

__1920

alpha_BETA_

alpha__1920

_BETA_1920

P.S。我的实际RegEx包含的内容超过6 words,而不是3 words

_不是一个实际的下划线,用替换它,我用它是因为``不允许我在文本的开头或结尾使用它。

2 个答案:

答案 0 :(得分:1)

Pattern Demo

模式:/\b[a-z]+(?:_[A-Z]+)?(?:_\d+)?\b|\b(?:[a-z]+_)?(?:[A-Z]+_)?\d+\b|\b[A-Z]+\b/

它从正面匹配,或从字符串背面匹配,或者匹配中间。请参阅demo for visual。

或者代替wordboundaries,您可以使用锚点来提高速度:

Pattern Demo

模式:

/^[a-z]+(?:_[A-Z]+)?(?:_\d+)?$|^(?:[a-z]+_)?(?:[A-Z]+_)?\d+$|^[A-Z]+$/

或者在非捕获组周围只有2个锚点:

/^(?:[a-z]+(?:_[A-Z]+)?(?:_\d+)?|(?:[a-z]+_)?(?:[A-Z]+_)?\d+|[A-Z]+)$/

答案 1 :(得分:0)

尝试将整个“字母加下划线”子模式封装到一个组中并应用?量词。此外,该号码不应该是可选的,是吗?

^([a-z]+_)?([A-Z]+_)?(\d+)$