【问题标题】:Javascript RegExp matching returning too manyJavascript RegExp 匹配返回太多
【发布时间】:2013-05-07 23:57:49
【问题描述】:

我需要获取一个字符串并从中获取一些值。我有这个字符串:

'tab/tab2/tab3'

'/tab3' 是可选的,所以这个字符串也应该可以工作:

'tab/tab2'

我目前正在尝试这个最有效的方法:

'tab/tab2/tab3'.match(new RegExp('^tab/([%a-zA-Z0-9\-\_\s,]+)(/([%a-zA-Z0-9-_s,]+)?)$'));

这将返回:

["tab/tab2/tab3", "tab2", "/tab3", "tab3"]

但我希望它返回

["tab/tab2/tab3", "tab2", "tab3"]

所以我需要去掉第 3 个索引项 ("/tab3") 并让它只使用 'tab/tab2' 字符串。

更复杂的是,我只能控制最后一个分组中的 /([%a-zA-Z0-9-_s,]+)? 部分,这意味着它将始终包含在一个分组中。

【问题讨论】:

    标签: javascript regex match


    【解决方案1】:

    您不需要正则表达式,只需使用split() 方法:

    var str = 'tab/tab2/tab3';
    var arr = str.split('/');
    
    console.log(arr[0]); //tab
    console.log(arr[1]); //tab2
    

    jsfiddle

    【讨论】:

    • 对于这个简单的例子,是的,但是还有更多的事情需要 RegExp。
    【解决方案2】:

    我使用这个正则表达式来做到这一点:

    'tab/tab2/tab3'.match(new RegExp('^tab/([%a-zA-Z0-9\-\_\s,]+)(?:/)([%a-zA-Z0-9-_s,]+)$'));
    

    现在我得到了这个回报

    ["tab/tab2/tab3", "tab2", "tab3"]
    

    现在我只需要允许“tab/tab2”也被接受...

    【讨论】:

    • 使用这个:'tab/tab2'.match(new RegExp('^tab/([%a-zA-Z0-9\-_\s,]+)(?:(? :/){1}([%a-zA-Z0-9\-_\s,]+))?$'))
    【解决方案3】:

    不要将正则表达式放在 " 或 ' 之间,使用 /g 进行全局搜索,否则只返回第一个匹配项

    "tab/tab2/tab3".match(/tab[0-9]/g)
    

    【讨论】:

    • 这是真的,内部代码实际上使用新的正则表达式来使用生成的字符串(为什么我只能访问最后一个分组)。已更新原始帖子以反映这一点:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2011-08-15
    • 1970-01-01
    相关资源
    最近更新 更多