【问题标题】:Regex-Groups in JavascriptJavascript 中的正则表达式组
【发布时间】:2014-05-11 12:21:50
【问题描述】:

我在使用 Javascript-Regexp 时遇到问题。

这是一个非常简化的正则表达式,它演示了我的问题:

(?:\s(\+\d\w*))|(\w+)

这个正则表达式应该只匹配不包含禁止字符的字符串(所有不是单词字符)。

唯一的例外是符号+
如果[0-9] 在尾随,则允许以该符号开始匹配。 并且+ 不得出现在单词中(44+44 不是有效匹配项,但+4ad 是)

为了让+只在开头,我说前面必须有一个空格。但是,我不希望空格成为匹配的一部分。

我用这个工具测试了我的正则表达式:http://regex101.com/#javascript,结果匹配看起来很好。

该正则表达式有 2 个问题:

  • 如果我在我的 JS 代码中使用它,空格总是匹配的一部分
  • 如果+42出现在行首,则不匹配

我的问题:

  • 正则表达式应该是什么样的?
  • 为什么这个正则表达式会在匹配项中添加空格?

这是我的 JS 代码:

var input =  "+5ad6  +5ad6 sd asd+as +we";
var regexp = /(?:\s(\+\d\w*))|(\w+)/g;
var tokens = input.match(regexp);
console.log(tokens);

【问题讨论】:

  • 空格:见stackoverflow.com/questions/7505762/… -- 使用非捕获组不会将其从total匹配中排除,仅将其添加到单个匹配组中.
  • @Jongware 那么有没有办法在没有空格的情况下提取令牌?不幸的是,JS 不支持lookbehinds

标签: javascript regex


【解决方案1】:

正则表达式应该是什么样子的?

您有多种选择来实现您的目标:

  • 你有它就很好。不过,您也可以允许 string beginning 代替空格。只需从中取出捕获组(tokens[1]tokens[2]),其中不包括空格。
  • 如果您不使用 JavaScript,lookbehind 可能会有所帮助。很遗憾,它不受支持。
  • + 之前需要一个非word-boundary,这会使+ 之前的每个\w 字符阻止匹配:

    /\B\+\d\w+|\w+/
    

为什么这个正则表达式会在匹配项中添加空格?

因为正则表达式确实匹配空格。不过,它不会将\s(\+\d\w+) 添加到captured groups

【讨论】:

  • 正则表达式甚至可以改进:(\B\+\d)?\w+
  • 是的,或者(?:\B\+\d)?\w+。我只是尽量不对原来的表达做大的改动。
  • 我收回 - 这种简化不起作用,因为它会强制以 + 开头的令牌之后至少有 2 个字符
  • 但是原来的表达式不也是这样吗?或者你的意思是\+\d\w*
  • 是的,我的意思是\+\d\w*
猜你喜欢
  • 2019-10-18
  • 2012-03-10
  • 2012-03-02
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多