我需要从下面的字符串中提取94.00
。
我会使用哪个正则表达式?我目前的[^$]+$
正则表达式正在返回$99.00 (176)
5 Easy Payments $94.00 $99.00 (176)
答案 0 :(得分:2)
您似乎可能想要使用此正则表达式:
let g:UltiSnipsSnippetDirectories=["UltiSnips"]
这符合所有价格,因此根据您的语言,juse使用该函数来获得第一次出现的价格。但是,这也会像\$[\d.]+
那样荒谬可笑。
$......
只会将\$[\d]+\.[\d]+
格式的价格与任意位数匹配。
$123.456
将匹配价格中最后一位数字的所有内容。这在当前状态下是无用的,因为它为您的测试字符串返回^[^$]+\$[\d]+\.[\d]+
。
5 Easy Payments $94.00
将与上述相同,但正则表达式的第1组将是价格^[^$]+(\$[\d]+\.[\d]+)
。如果您只想匹配数字本身,请将左括号移开,使其变为$94.00
。
问题是如果在第一个有效价格之前的某个地方存在非价格美元符号,则不返回任何匹配项。只要这不是问题,那么^[^$]+\$([\d]+\.[\d]+)
会为Capture Group 1提供^[^\$]+\$([\d]+\.[\d]+)
。
答案 1 :(得分:1)
如果你不能使用任何正常的编程方法来控制你得到的匹配数量,你需要使用捕获机制:
/(\$\d+(?:\.\d+)?)[\s\S]*/
此正则表达式找到第一个(因为任何正则表达式引擎从左到右处理字符串,至少在默认情况下是这样)$
+ 1 or more digits
+ an optional sequence of '.' and 1 or more digits
,捕获此文本进入第1组(使用(\$\d+(?:\.\d+)?)
),然后匹配,使用[\s\S]*
消耗字符串的其余部分(任意0或更多的角色)。