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) 如果要捕获的编号之前的零件显示为