【问题标题】:Filter out numbers out of a text using regular expressions in javascript使用 javascript 中的正则表达式从文本中过滤掉数字
【发布时间】:2011-03-07 00:55:53
【问题描述】:

使用 javascript 正则表达式从文本中获取数字的最佳方法是什么? 例如....我有“$ 4,320 text/followme”,我想从中获得4320。但是,我想在第一次出现字母或除逗号','以外的任何非字母后避免数字

所以如果我有 4,320 美元 t234ext/followme,它仍然会返回 4320。 输入总是在开头有 $ 符号

所以正则表达式应该返回

 $4,320 text/followme          returns  4320
 $4,320 t3444ext/followme      return   4320
 $4,320 /followme              return   4320
 $4320 text/followme           return   4320
 $4320 t3444ext/followme       return   4320
 $4320 /follow4me              return   4320

【问题讨论】:

  • 我认为第一个非数字更健壮。
  • 你要的是numbers,还是number文本?

标签: javascript regex string


【解决方案1】:

可能寻找的最简单的正则表达式是\D(任何不是数字的字符。其中有一些“否定”表达式——\d 匹配数字, \D 匹配非数字。\w 匹配“单词”字符(字母数字加下划线),\W 匹配非数字。\s 匹配空白,\S 匹配非空白字符)。

所以:

str = '$4,320 text/folowme';
number = str.replace(/\D/g,'');

应该在数字内产生“4320”。 “g”很重要。它说对该正则表达式的所有实例进行 global 搜索/替换。没有它,您将失去美元符号。 :)

请注意,如果您有负数或有理数(它们的表示中可以有两个非数字字符,'-' 和 '.'),您的问题会变得有点困难。你可以这样做:

number = str.replace(/[^-.0-9]/g,'');

只要您的数字格式正确,这将起作用——因为没有人会做像“4-5.0-9aaaa4z.2”这样疯狂的事情。

为了安全起见,您可以通过parseIntparseFloat 运行该列表位:

number = parseFloat(str.replace(/[^-.0-9]/g,''));

更新

我隔开要求以避免包括后续数字。如果空格可靠地分隔了您想要的数字的结尾,就像在示例中所做的那样,您可以在我给出的最后一个示例中的否定字符类中添加一个空格或 \s,所以它会是这样的:

number = parseFloat(str.replace(/[^-.0-9\s]/g,''));

它会很好地去除多余的数字。

更新 2

考虑了一会儿,使用parseFloat 意味着您不必删除所有内容 - 只需删除所有非数字字符 您想要的数字和逗号.所以我们可以把它分解成两个更简单的正则表达式(可能更快,特别是因为其中一个是非全局的)。然后 parseFloat 将为您丢弃尾随的非数字输入。

number = parseFloat(str.replace(/,/g,'').replace(/^[^-0-9]*/,''));

【讨论】:

  • 我稍后会对此进行测试,但我认为这甚至会给我出现在第一个字母之后的数字...所以 $4,320 t778ext/folowme 会给我 432077 吗?
  • 确实如此。如果空格标记数字的结尾,那么您可以将最后一个正则表达式更改为 [^-.0-9 ],如果您想更彻底,甚至可以更改为 [^-.0-9\s]。通过 parseFloat 或 parseInt 运行它,它会在第一个空格处停止,你不会得到后续的数字。
【解决方案2】:

这是一个稍微复杂的正则表达式。

第 2 行:它检查初始的“$”,并允许其后的数字 (0-9) 和逗号的任意组合。

第 3 行:删除数值中的前导 $ 和任何逗号。

我不知道,但是我想说JavaScript支持分组,并且可以在match语句中只用逗号获取数值,简化替换语句以仅删除逗号。

var str="$4,320 t3444ext/followme";
var regex = /^\$([0-9,])*/g;
var matchedNum = str.match(regex)[0].replace(/[\$,]/g, '');

【讨论】:

    【解决方案3】:
    function parseNumber(input) {
        var r = "", i = 0, c = "", s = input + " ";
        if (s.charAt(0) === "$") {
            i++;
        } 
        while (i < s.length) {        
            c = s.charAt(i++);
            if (c < "0" || c > "9") {
                if (c === ",") {
                    continue;
                }
                break;
            }
            r += c;
        }
        return r;
    }
    

    【讨论】:

    • 问题中提到程序员正在寻找 JavaScript Regular Expressions 解决方案。
    【解决方案4】:
    string.split(/ /)[0].replace(/[^\d]/g, '')
    

    【讨论】:

    • 你能给我更多关于上述正则表达式的信息吗...我无法解释我在正则表达式中是多么容易混淆...
    • 我建议以(string || "0 0")开头。
    • @zoom:它在一个空格上拆分,获取结果数组的第一个元素并从中删除所有非数字。 string 是您的主题字符串。
    猜你喜欢
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多