我有一个正则表达式,用于测试期望货币的用户输入。此语句允许使用可选的美元符号,允许使用可选的逗号(只要它们被正确放置),并允许一个小数点,只要它后跟至少另一个数字。
^\$?\d{1,3}(,?\d{3})*(\.\d{1,2})?$
例如
都是设计允许的。然而,有一个与我想要的不匹配。如果用户想要输入类似.34的数字,则必须输入零。所以0.34匹配,但.34没有。
这是我如何更新声明以解决此问题。
^(\$?\d{1,3}(,?\d{3})*)?(\.\d{1,2})?$
我在小数点之前将整个语句作为捕获组并使其成为可选项。我现在担心的是,我的整个正则表达式语句由两个可选的捕获组包围。我不想要一个空白区域来匹配这种模式,我认为它会。对于我想要完成的事情,有没有更好的选择?
编辑:我的原始语句不匹配.12然而,第二个更新的语句确实存在,因为整个语句包含在可选的捕获组中,空格会匹配此模式,这是不可取的。
答案 0 :(得分:2)
您的可选群组是正确的进行方式。请注意,当您不必在以后访问捕获的子值时,仅用于对子模式序列进行分组的非捕获组会更有效。
你唯一真正想念的是避免匹配一个空字符串。你可以使用积极的前瞻(?=.)
或(?!$)
否定前瞻来实现它:
^(?!$)(?:\$?\d{1,3}(?:,?\d{3})*)?(?:\.\d{1,2})?$
请参阅regex demo
<强>详情
^
- 字符串开头(?!$)
- 字符串(?:
- 启动可选的非捕获组
\$?
- 1或0 $
个符号\d{1,3}
- 1至3位数字(?:
- 非捕获组的开始重复0+序列
,?
- 1或0逗号\d{3}
- 3位数)*
- 非捕获组的结束)?
- 可选非捕获组的结尾(?:\.\d{1,2})?
- 一个可选的非捕获组,匹配1或0个序列
\.
- 一个点\d{1,2}
- 1或2位数字$
- 字符串结束。答案 1 :(得分:0)
您可以使用&#34;或&#34;语法|
^\$?(\d{1,3}(,?\d{3})*|0)(\.\d{1,2})?$
我还建议你不要捕捉(,\d{3})*
^\$?(\d{1,3}(?:,?\d{3})*|0)(\.\d{1,2})?$
(\d{1,3}(?:,?\d{3})*|0)
金额\d{1,3}(?:,?\d{3})*
或0