【问题标题】:Regular Expression: Match whole numbers in string正则表达式:匹配字符串中的整数
【发布时间】:2016-04-25 15:41:03
【问题描述】:

我正在尝试使用 JavaScript 在具有以下格式的字符串中匹配数字:

NUM;#username;#NUM;#username

例如,在以下字符串中:

252;#Lemmywinks07;#27;#Trogdor

我会捕获 25227

但是,我在构建捕获这两个数字的正则表达式时遇到了问题。我认为使用全局会匹配两者,但是当我运行以下命令时:

/\d+/g.exec("252;#Lemmywinks07;#27;#Trogdor");

它返回:[252] 而不是 [252, 27]

我应该注意我不想匹配用户名中的数字(用户名不能只是数字)。所以看起来我会匹配介于“;#”或“;#”之前的整数之间的整数。

提前致谢!

编辑:

示例现在在用户名中包含数字。我不想匹配用户名中的数字。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    如果用户名中没有数字...

    要查找匹配项,您实际上需要使用 match() 函数而不是 exec()

    var input = '252;#Lemmywinks;#27;#Trogdor';
    var output = input.match(/\d+/g); // yields ['252', '27'];
    

    如果用户名中有数字...

    或者,您可以通过split() 函数使用;# 字符将现有字符串拆分为单独的组件,并相应地测试每个部分:

    var input = '252;#Lemmywinks2;#27;#Trogdor';
    var output = input.split(/[;#]/).filter(function(x){ return (/^\d+$/g).test(x); }); 
    

    【讨论】:

    • 谢谢里昂!我最初已将您的答案标记为答案,但忘记了这也会匹配用户名中的数字,这是我不想要的。我更新了我的问题以包含包含数字的用户名。
    • 第二种方法不会。该示例包括“Lemmywinks2”,但输出不包括它。你可以see examples of each of these here
    • 你赢了 :) 再次感谢
    • 没问题。我在回复中将答案分开,以使它们更易于使用。
    【解决方案2】:

    当你想获得所有匹配时,不要使用exec,而是使用match

    "252;#Lemmywinks;#27;#Trogdor".match(/\d+/g);
    

    exec 用于迭代使用,您必须循环直到没有更多结果,而match 立即为您提供一个数组。

    只取完整字段的数字,我不会在这里使用正则表达式,我会拆分:

    "252;#Lemmywinks;#27;#Trogdor".split(";#").map(Number).filter(v=>v===v)
    

    (请注意,此解决方案还直接为您提供数字而不是字符串)

    【讨论】:

    • OP 应该使用更清晰的示例 - 这也会提取用户名中的数字,而 OP 不想匹配。
    • 再来一次?听起来我正在获得声誉!
    【解决方案3】:

    您可以匹配整行并使用以下正则表达式检索适当的组:

    var linePattern = /(\d+);[^;]*;#(\d+);[^;]*/
    

    然后data.match(linePattern)[1] 将返回第一个数字,data.match(linePattern)[2] 第二个数字和data.match(linePattern)[0] 整行。

    虽然这种方法比匹配行中的数字或围绕分隔符拆分要重,但它具有检查行是否符合预期模式并避免为异常条目返回不连贯结果的优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 2022-09-23
      • 2012-06-05
      • 2013-12-25
      相关资源
      最近更新 更多