【问题标题】:Regular expression for $ amount fields with or without bracket带或不带括号的 $ 金额字段的正则表达式
【发布时间】:2023-03-03 02:39:01
【问题描述】:

我需要使用正则表达式来验证输入中的以下数量格式 $10.00 0r ($10.00) ... 金额应为 R2 格式,带有带或不带括号的 $ 符号。如果是其他格式,则验证必须失败。请就此提出建议。

【问题讨论】:

  • 这个“R2”格式是什么?对小数位数有限制吗?
  • 金额只保留两位小数

标签: regex xsd-validation


【解决方案1】:

更新:
根据下面的 cmets 和关于 R2 格式的问题中的评论,修改后的正则表达式将是:

((\($\d+\.\d{2}\))|($\d+\.\d{2}))

较早的答案:
试试这个正则表达式:

\$\s*\(?\d+(\.\d+)?\)?

\$ - 匹配美元符号
\s* - 匹配美元符号和数字或大括号之间的任何空格
\(? - 匹配可选的左大括号
\d+ -匹配数字的整数部分
(\.\d+)? - 匹配可选的小数部分和点
\)? - 匹配可选的右大括号

所以你可以试试这个 xsd 验证器:

<xs:simpleType name="CurrencyFormat">
    <xs:restriction base="xs:string">
        <xs:pattern value="\$\s*\(?\d+(\.\d+)?\)?" />
    </xs:restriction>
</xs:simpleType>

【讨论】:

  • 很好,但是(a)您不需要(也不能)在 XSD 正则表达式中转义 $,并且(b)您不想接受没有匹配的左括号右括号,反之亦然。并且 (c) 尽管 OP 对此并不清楚,但他们似乎希望小数点右侧正好有两位数,这对于货币金额来说很常见。
  • 该模式应该适用于 $10.00 和 ($10.00) 格式。我希望您的答案适用于第一个但第二个?
  • 这也允许:$10.00)($10.00
  • @C.M.Sperberg-McQueen & Denomales :很好的捕捉和适当的记录。修改了正则表达式。
【解决方案2】:

试试这个:

^(\(\$\d+\.\d{2}\)|\$\d+\.\d{2})$

【讨论】:

  • 我不认为 xsd 验证支持锚标签
  • 锚标签?无论如何,在 RegexCoach 上它似乎可以工作,可能您需要检查 xsd 文档并查看它的正则表达式如何映射到标准正则表达式
  • 从 OP 对问题的标记来看,我怀疑需要符合 XSD 的正则表达式;不是^(\(\$\d+\.\d{2}\)|\$\d+\.\d{2})$,而是\($\d+\.\d{2}\)|$\d+\.\d{2}\)
  • @C.M.Sperberg-McQueen - 大声笑,你用正确的正则表达式打败了我。点赞。
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多