将RegEx从3位数改为4位

时间:2014-02-01 05:15:00

标签: 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。

从我在表达式中看到的内容来看,它的硬编码只有3位数,因此我想知道是否有一种方法可以修改它以便在有4位数的情况下工作。

4 个答案:

答案 0 :(得分:2)

如果有2位或更多位数,则./\s*与第一位数匹配。删除它,看看它是否有效......

value.replace(/\s*(\d+[,.]\d+)[^\d]/m, "$1");

答案 1 :(得分:1)

试试这个

   value.replace( /\s*.(\d+[,.]\d+)[^\d]/m, "$1");

WORKING REGEX

输出:

enter image description here

答案 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个或多个字符的字符串} (点)或 ".*" (逗号),其中 的最后一个字符包含数字。