Regex 将正则表达式从3位数更改为4位数
我对正则表达式不太在行,手头有以下代码:Regex 将正则表达式从3位数更改为4位数,regex,Regex,我对正则表达式不太在行,手头有以下代码: value.replace(/\s*.*(\d+[,\.]\d+)[^\d]*/m, "$1"); 现在它非常适合将这个“\r\n\t\t\t\t$;0.05 USD\t\t\t”(请注意,我故意在和之间留了一个空格,因为删除它会在站点上将其转换为美元符号)减少为这个“0.05”。我遇到的问题是,如果数字是两位数(10.05而不是0.05),表达式会从前面删除该数字,并且仍然输出0.05而不是10.05 从表达式中可以看出,它是硬编码的,只能拾取
value.replace(/\s*.*(\d+[,\.]\d+)[^\d]*/m, "$1");
现在它非常适合将这个“\r\n\t\t\t\t$;0.05 USD\t\t\t”(请注意,我故意在和之间留了一个空格,因为删除它会在站点上将其转换为美元符号)减少为这个“0.05”。我遇到的问题是,如果数字是两位数(10.05而不是0.05),表达式会从前面删除该数字,并且仍然输出0.05而不是10.05
从表达式中可以看出,它是硬编码的,只能拾取3个数字,因此我想知道是否有方法修改它,使其在有4个数字的情况下也能工作。如果有2个或更多数字,则
/\s*
之后的
与第一个数字匹配。移除它,看看它是否有效
value.replace(/\s*(\d+[,.]\d+)[^\d]/m, "$1");
如果有2个或更多数字,则
/\s*
之后的
与第一个数字匹配。移除它,看看它是否有效
value.replace(/\s*(\d+[,.]\d+)[^\d]/m, "$1");
试试这个
value.replace( /\s*.(\d+[,.]\d+)[^\d]/m, "$1");
输出:
试试这个
value.replace( /\s*.(\d+[,.]\d+)[^\d]/m, "$1");
输出:
该
*
贪婪地匹配,因此,只要模式的其余部分仍然可以匹配,就可以匹配尽可能多的字符,包括数字
如果只剩下一个数字供/d+
匹配,则模式的其余部分仍然可以匹配,因此您在那里只剩下一个数字
如果示例中的分号始终位于要匹配的字符串中的该位置,请将其用作如下标记
value.replace(/.*;(\d+[,\.]\d+).*/m, "$1");
*
贪婪地匹配,因此,只要模式的其余部分仍然匹配,就可以匹配尽可能多的字符,包括数字
如果只剩下一个数字供/d+
匹配,则模式的其余部分仍然可以匹配,因此您在那里只剩下一个数字
如果示例中的分号始终位于要匹配的字符串中的该位置,请将其用作如下标记
value.replace(/.*;(\d+[,\.]\d+).*/m, "$1");
给出您的正则表达式示例:
/\s*.*(\d+[,.]\d+)[^\d]/m
和数据:
\r\n\t\t\t\t$0.05 USD\t\t\t
\r\n\t\t\t\t$10.05 USD\t\t\t
在正则表达式中,前导的“/”
(正斜杠),以及“/”
前面的“m”
分隔正则表达式,并且不是匹配的一部分
正则表达式中的“\s”
是[\t\r\n\f]
的缩写,它与空格(空格、制表符、回车符、换行符、换行符)匹配。因此,“\s*”
将匹配“\r\n\t\t\t”
正则表达式中的“”
(点)匹配任何单个字符(通常是除“\n”
以外的任何字符)
“*”
后面的
表示匹配任何0或更多的字符。因此,“*”
与“$;”
一起匹配(此外,可能还有一个或多个数字…见下文)
接下来,正则表达式中的”(“
启动正则表达式中将“捕获”部分数据的部分
正则表达式中的“\d”
将匹配任何1个数字。实际上“\d”
匹配[0-9]和其他数字字符,如东方阿拉伯数字“???????”
“+”
后面的“\d”
表示匹配任何一个或多个数字(数字)
正则表达式中的“[,.]”
将匹配文本”
(点)或,“
(逗号)中的一个,以匹配“十进制”分隔符
另一个“\d+”
,以匹配任何一个或多个数字(数字)
接下来,正则表达式中的“关闭将“捕获”部分数据的正则表达式部分
“[^\d]”
将匹配不是数字(数字)的任何1个字符。因此,在本例中,它将匹配”
(空格)
正则表达式末尾的(在第二个“/”
之后):“m”
更改了“^”
和“$”
锚点的行为,这些锚点未在正则表达式中使用,因此
应该没有效果。但是,如果您使用的是Ruby,“m”
会更改“
(点)的行为
现在,“问题”。。。“*”
(在”(“
)之前)用正则表达式表示为“贪婪”。这意味着它将尽可能“早”匹配,并尽可能“长”匹配。因此,如果”;“
之后有超过1个数字,则”*
将消耗一些数字
注意:使用“*”
可能会导致各种问题,尤其是在Ruby下使用“/m”
。如果可能,最好避免使用“*”
有两种方法可以解决这个问题
1) 如果要捕获的数字之前的部分始终是”$;
,则在正则表达式中指定该部分,而不是“*”
。所以像这样:
/\s*$(\d+[,.]\d+)[^\d]/m
/\s[^.,]*[^\d](\d+[,.]\d+)[^\d]/m
或者,如果它总是“$;”
或类似的内容:
/\s*[^;]+;(\d+[,.]\d+)[^\d]/m
在这里,“[^;]+;”
表示任何由1个或多个字符组成的字符串,不包含“;”
,后跟“[;]”
2) 如果要捕获的编号之前的零件显示为