我正在摆弄正则表达式,试图了解模式是如何工作的,但我似乎无法正确理解它。
我正在测试一串数字。这个想法是,测试应该只对仅由以下内容组成的字符串返回 true:可选部分(数字“9”后跟或不跟空格)和必需部分(任意三个数字)。 所以像 "345" "9345" 和 "9 345" 这样的字符串应该返回 true 而像 "99345" "9 345" 这样的字符串(这里是双倍空格,自动样式一直将它压缩到一个空格) " 345" “45”或“3456”应该返回 false。
我得到的最接近预期结果的是正则表达式模式
/^[9]?[ ]?\d{3}$/
,它几乎适合但对于字符串“345”仍然返回真值。
我试图从这里开始并将模式修改为这个
/^[9]?[(?<=9) ]?\d{3}$/
因此只有在它前面有 9 时空格才匹配,但它似乎不起作用,结果与之前的模式相同。然后我尝试了这个 /^[9|9 ]?\d{3}$/
来暗示字符串可能以“9”或“9”开头,也可能不以“9”开头,但对于“345”仍然返回 true,并且由于某种原因也开始为“9 345”返回 false。
我也试过这个版本
/^[^ ]^[9]?[ ]?\d{3}$/
和 /^[^\s]^[9]?[ ]?\d{3}$/
和这个 /^[\S]^[9]?[ ]?\d{3}$/
来暗示字符串不能以空格(或空格本身)开头,但这似乎只会破坏一切,因为那时没有任何匹配。
我现在没有想法,所以任何提示和建议都会受到赞赏。
您可以编写模式,可选地匹配一个 9 后跟一个可选的空格:
^(?:9 ?)?\d{3}$
如果你想让 0 和 9 都可选并且你想使用环视(你不必这样做,因为可选组也足够):
使用 lookbehind
断言字符串在匹配后不以空格开头^[9]? ?(?<!^ )\d{3}$
使用先行
断言字符串不以空格开头^(?! )9? ?\d{3}$