正则表达式将价格与不同的数字相匹配

Regex to match prices with different digit

提问人:carlcaroline 提问时间:11/1/2023 最后编辑:The fourth birdcarlcaroline 更新时间:11/11/2023 访问量:107

问:

我正在尝试编写一个带有 go 的正则表达式来匹配价格,该价格至少由五位数组成,价格上带有逗号。

例如:

"10,400,000","10,900,000","500,000",

我正在尝试以下表达式:“((\d+)(,)(\d+))(,)...”(,)仅匹配具有八位数字(两个逗号)的序列。

例如:

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

我认为如果我处理它两次(一个是带有两个逗号的数字,另一个是带有一个逗号的数字)会效率很高。如何为整个模式制作表达式?

谢谢

正则表达式 regex-greedy

评论

0赞 Jerry Jeremiah 11/1/2023
regex101.com/r/RgoXzl/1\b(?|\d?\d?\d(?:,?\d\d\d)+,?\d\d\d|\d?\d\d,?\d\d\d)\b
0赞 Cary Swoveland 11/2/2023
我假设指的是三个单独的字符串,而不是包含双引号以及数字和逗号的单个字符串(例如用单引号分隔)。如果是这样,我建议您将每个字符串放在单独的行上。"10,400,000","10,900,000","500,000",
0赞 Cary Swoveland 11/2/2023
@Jerry,您的正则表达式匹配 ,in 和 in 。"00,000""10,000""10,000,00""100,000"",100,000"

答:

2赞 Cary Swoveland 11/1/2023 #1

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

要匹配 10,000 到 999,999 之间的数字,我们可以使用

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

为了匹配 1,000,000 或更大的数字,我们可以使用

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

因此,我们只需要构建一个由这两种表达方式组成的交替。

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

演示


此表达式可以细分如下。

^          # 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,})$

评论

0赞 Darin 11/1/2023
你非常接近,但他的例子,不适用于你的正则表达式。此外,部分除以的顺序是错误的。将其更改为 ,请参阅内容。"10,400,000","10,900,000","500,000",|[1-9]\d{0,2}(?:,\d{3}){2,}|[1-9]\d{1,2},\d{3}
0赞 Cary Swoveland 11/1/2023
@Darin,l(和 @Thefourthbird)假定 OP 期望每个字符串用逗号表示单个数字,即字符串(如 和 ),而不是包含多个数字表示形式的字符串(如 )。另请注意,您建议的正则表达式在字符串和 中匹配。"10,400,000""10,900,000""500,000"'"10,400,000", "10,900,000", "500,000"'"50,000"",050,000""50,00000"
0赞 Darin 11/2/2023
50,000是 5 位数字,他说“至少 5 位数字”。我不相信围棋允许任何形式的向前或向后看,但是,如果像他所示引用数字,那么也许你可以抓住引号:"(?:[1-9]\d{0,2}(?:,\d{3}){2,}|[1-9]\d{1,2},\d{3})"
0赞 Cary Swoveland 11/2/2023
@Darin,我不认为 OP 希望字符串包含引号,但我会问。
2赞 The fourth bird 11/1/2023 #2

您可以使用:

^(?:\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 位数字,
  • $字符串末尾

观看正则表达式演示


在不接受前导零的情况下,您可以使用以下量词开始匹配并说明它:[1-9]

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

查看另一个正则表达式演示

评论

0赞 The fourth bird 11/1/2023
@CarySwoveland 好点,我添加了另一个选项来解释这一点。
1赞 Darin 11/2/2023 #3

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

  1. 您可以获取捕获带有数字的双引号的匹配项,请参阅此 Regex101
    • "(?:[1-9]\d{0,2}(?:,\d{3}){2,}|[1-9]\d{1,2},\d{3})"
  2. 第二种选择取决于在 Go 语言中可以做什么。如果可以捕获组而不是匹配项,则可以排除双引号,请参阅此 Regex101
    • (?:")([1-9]\d{0,2}(?:,\d{3}){2,}|[1-9]\d{1,2},\d{3})(?:")
0赞 Reilas 11/11/2023 #4

可能,我误解了这个问题。
为什么“500,000”是无效的,它有“......价格上至少有五位逗号......“

请尝试以下匹配模式

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