Go语言 正则表达式匹配不同数字的价格

7lrncoxx  于 2023-11-14  发布在  Go
关注(0)|答案(4)|浏览(93)

我试图写一个正则表达式与去匹配价格组成的至少五位数与逗号的价格。
举例来说:
“1040万”,“1090万”,“50万”,
我尝试了下面的表达式:“((\d+)(,)(\d+))(,)..."(,)它只匹配八位数(两个逗号)的序列。
举例来说:

"10,400,000", valid
"10,900,000", valid
"500,000", invalid

字符串
我不认为如果我处理两次(一次是两个逗号的数字,另一次是一个逗号)会有效率。我如何才能使整个模式的表达式?
Thank u

vsmadaxz

vsmadaxz1#

您可以使用:用途:

^(?:\d{2,3}|\d{1,3},\d{3})(?:,\d{3})+$

字符串
模式匹配:

  • ^字符串开头
  • (?:备选方案的非捕获组
  • \d{2,3}匹配2-3位数字
  • |
  • \d{1,3}匹配1-3位数字
  • ,\d{3}匹配一个逗号和3个数字
  • )关闭非捕获组
  • (?:,\d{3})+重复1+次匹配,和3位数字
  • 结束于字符串结尾

参见regex demo
如果不接受前导零,你可以用[1-9]开始匹配,并在下面的量词中说明它:

^(?:[1-9]\d{1,2}|[1-9]\d{0,2}(?:,\d{3})+)(?:,\d{3})+$


另见regex demo

rm5edbpk

rm5edbpk2#

注意,我们需要匹配10,000到999,999之间的数字,或者匹配1,000,000或更大的数字,并在正确的位置使用逗号。
为了匹配10,000和999,999之间的数字,我们可以使用

^[1-9]\d{1,2},\d{3}$

字符串
为了匹配100万或更大的数字,

^[1-9]\d{0,2}(?:,\d{3}){2,}$


因此,我们只需要构造一个由这两个表达式组成的替换。

^(?:[1-9]\d{1,2},\d{3}|[1-9]\d{0,2}(?:,\d{3}){2,})$


Demo
这个表达式可以分解如下。

^          # match beginning of the string
(?:        # non-capture group
  [1-9]    # match the leading digit, any digit other than zero
  \d{1,2}  # match between 1 and 2 digits
  ,\d{3}   # match a comma followed by 3 digits
  |        # or
  [1-9]    # match the leading digit, any digit other than zero
  \d{0,2}  # match between 0 and 2 digits
  (?:      # begin a non-capture group
    ,\d{3} # match a comma followed by 3 digits
  ){2,}    # end the non-capture group and executed it >= 2 times
)          # end the non-capture group 
$          # match the end of the string


最后,我们可以分解出前导数字的匹配。

^[1-9](?:\d{1,2},\d{3}|\d{0,2}(?:,\d{3}){2,})$

ztigrdn8

ztigrdn83#

假设您的示例"10,400,000","10,900,000","500,000",是您正在使用的典型示例,那么看起来您可能有两个选择。

  • 您可以获取捕获数字的双引号的匹配,请参阅Regex101
  • "(?:[1-9]\d{0,2}(?:,\d{3}){2,}|[1-9]\d{1,2},\d{3})"
  • 第二种选择取决于Go语言中可以做什么。如果你可以捕获组而不是匹配,那么可以排除双引号,请参阅Regex101
  • (?:")([1-9]\d{0,2}(?:,\d{3}){2,}|[1-9]\d{1,2},\d{3})(?:")
q7solyqu

q7solyqu4#

可能,我误解了这个问题。
为什么 “500,000” 是无效的,它有 *"..
试试下面的匹配模式。

\"\d\d\d?(?:,\d{3})+\"

字符串

相关问题