提问人:carlcaroline 提问时间:11/1/2023 最后编辑:The fourth birdcarlcaroline 更新时间:11/11/2023 访问量:107
正则表达式将价格与不同的数字相匹配
Regex to match prices with different digit
问:
我正在尝试编写一个带有 go 的正则表达式来匹配价格,该价格至少由五位数组成,价格上带有逗号。
例如:
"10,400,000","10,900,000","500,000",
我正在尝试以下表达式:“((\d+)(,)(\d+))(,)...”(,)仅匹配具有八位数字(两个逗号)的序列。
例如:
"10,400,000", valid
"10,900,000", valid
"500,000", invalid
我认为如果我处理它两次(一个是带有两个逗号的数字,另一个是带有一个逗号的数字)会效率很高。如何为整个模式制作表达式?
谢谢
答:
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",
- 您可以获取捕获带有数字的双引号的匹配项,请参阅此 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})(?:")
0赞
Reilas
11/11/2023
#4
可能,我误解了这个问题。
为什么“500,000”是无效的,它有“......价格上至少有五位逗号......“?
请尝试以下匹配模式。
\"\d\d\d?(?:,\d{3})+\"
评论
\b(?|\d?\d?\d(?:,?\d\d\d)+,?\d\d\d|\d?\d\d,?\d\d\d)\b
"10,400,000","10,900,000","500,000",
"00,000"
"10,000"
"10,000,00"
"100,000"
",100,000"