我在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。
从我在表达式中看到的内容来看,它的硬编码只有3位数,因此我想知道是否有一种方法可以修改它以便在有4位数的情况下工作。
答案 0 :(得分:2)
如果有2位或更多位数,则.
后/\s*
与第一位数匹配。删除它,看看它是否有效......
value.replace(/\s*(\d+[,.]\d+)[^\d]/m, "$1");
答案 1 :(得分:1)
答案 2 :(得分:1)
.*
匹配贪婪,因此可以匹配尽可能多的字符,包括数字,只要模式的其余部分仍然可以匹配。
如果只剩下一个数字让/d+
匹配,那么剩下的模式仍然可以匹配,所以你最后只能得到一个数字。
如果示例中的分号始终位于您希望匹配的字符串中的那个位置,请将其用作此标记
value.replace(/.*;(\d+[,\.]\d+).*/m, "$1");
答案 3 :(得分: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
在正则表达式中, {{1}之前的前导 "/"
(正斜杠)和 "/"
分隔正则表达式,不是匹配的一部分。
正则表达式中的 "m"
是 "\s"
的简写,它匹配空格(空格,制表符,回车符,换行符,换页)。因此, [ \t\r\n\f]
将匹配 "\s*"
正则表达式中的 "\r\n\t\t\t\t"
(点)匹配任何单个字符(通常是除 "."
之外的任何字符)。
"\n"
后面的 "*"
表示匹配任何0 或更多 人物。因此, "."
一起匹配 ".*"
(可能还有一个或多个数字......见下文)。
接下来,正则表达式中的 "$"
启动将“捕获”部分数据的正则表达式部分。
正则表达式中的 "("
将匹配任何1个数字。实际上 "\d"
匹配[0-9]和其他数字字符,例如东方阿拉伯数字 "\d"
。
"??????????"
后面的 "+"
表示匹配任何1 或更多 数字(数字)。
正则表达式中的 "\d"
将匹配文字 "[,.]"
的 一个 (点)或 "."
(逗号),以匹配“十进制”分隔符。
另一个 ","
,以匹配任何1 或更多 数字(数字)。
接下来,正则表达式中的 "\d+"
会关闭将“捕获”部分数据的正则表达式部分。
")"
将匹配 不 数字(数字)的任何1个字符。所以,在这种情况下,它将匹配
"[^\d]"
(空格)。
正则表达式末尾的 " "
(在第二个 "m"
之后): "/"
更改 "m"
和 "^"
锚点的行为,这些锚点未在您的正则表达式中使用,因此 {{1 应该没有任何效果。但是,如果您使用的是Ruby, "$"
会更改 "m"
(点)的行为。
现在,“问题”...... "m"
(在 "."
之前)是正则表达式,“贪婪” 。这意味着它将尽可能“早”匹配,并尽可能“长”。因此,如果 ".*"
后面的数字超过1位数,则 "("
会消耗一些数字。
注意:使用 ";"
会导致各种问题,尤其是Ruby下的 ".*"
。如果可能,最好避免使用 ".*"
。
有两种方法可以解决这个问题。
1)如果要捕获的数字之前的部分始终为 "/m"
,请在正则表达式中指定,而不是 ".*"
。像这样:
"$"
或者,如果它总是 ".*"
或与此类似的东西:
/\s*$(\d+[,.]\d+)[^\d]/m
此处, "$"
表示 不 的任何一个或多个字符的字符串包含 {{1接下来是 /\s*[^;]+;(\d+[,.]\d+)[^\d]/m
。
2)如果要捕获的数字之前的部分(显示为 "[^;]+;"
)在数据中可能完全不同,那么您只需要确保该部分目前 ";"
的正则表达式与最后一个位置的数字不匹配。像这样:
"[;]"
此处, "$"
表示 不 包含 {{1}的0个或多个字符的字符串} (点)或 ".*"
(逗号),其中 不 的最后一个字符包含数字。