正则表达式模式不匹配以空格开头的字符串

问题描述 投票:0回答:2

我正在摆弄正则表达式,试图了解模式是如何工作的,但我似乎无法正确理解它。

我正在测试一串数字。这个想法是,测试应该只对仅由以下内容组成的字符串返回 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}$/
来暗示字符串不能以空格(或空格本身)开头,但这似乎只会破坏一切,因为那时没有任何匹配。

我现在没有想法,所以任何提示和建议都会受到赞赏。

regex
2个回答
0
投票

您可以编写模式,可选地匹配一个 9 后跟一个可选的空格:

^(?:9 ?)?\d{3}$

正则表达式演示


如果你想让 0 和 9 都可选并且你想使用环视(你不必这样做,因为可选组也足够):

使用 lookbehind

断言字符串在匹配后不以空格开头
^[9]? ?(?<!^ )\d{3}$

使用先行

断言字符串不以空格开头
^(?! )9? ?\d{3}$

0
投票

正则表达式

^(9 |9)?\d{3}$
有效吗? 我个人使用 https://regexr.com 来构建我的正则表达式。测试部分允许您输入必须通过正则表达式的内容和必须通过正则表达式的内容

© www.soinside.com 2019 - 2024. All rights reserved.