【问题标题】:Match two different rules (javascript regexp) [duplicate]匹配两个不同的规则(javascript regexp)[重复]
【发布时间】:2019-01-07 00:15:44
【问题描述】:

我需要编写正则表达式,它可以找到一个作为函数参数和星号进行验证的字符串。我写那个 'some*'.match(/^[a-z0-9]+|(\*$)/i)

但它没有找到星号。第二个结果项只是未定义..

我打算得到字符串“some”和“*”,如果你在一些没有星号的词中搜索,它必须只找到那个词。

【问题讨论】:

  • 管道符号 (|) 表示正则表达式在找到第一个匹配项后停止评估您的字符串
  • 'some*'.match(/^[a-z0-9]+|\*$/gi) - 您只搜索了第一个匹配项,g 将启用多个搜索。
  • @WiktorStribiżew 谢谢!

标签: javascript regex


【解决方案1】:

您需要在第一个 [a-z0-9] 部分周围添加一个额外的捕获组,而第二个应该是可选的 ?

另外,| 不应该在那里,因为它指定了两个不同的选择,所以你的RegExp 实际上是在尝试匹配/^[a-z0-9]+/i,如果不匹配,那么它会尝试/(\*$)/i,这不是你想要的。这就是为什么即使有星号也会得到undefined 的原因,也是为什么以星号结尾且不以a-z0-9 开头的任何内容(例如_*)也会匹配。

这是一个包含所有这些更改的示例:

const match1 = 'some'.match(/^([a-z0-9]+)(\*)?$/i);
const match2 = 'some*'.match(/^([a-z0-9]+)(\*)?$/i);

console.log(match1);
console.log(match2);

如果你想去掉第一个匹配项,只得到星号匹配项,你可以使用Array.prototype.slice() Array.prototype.filter()

const match1 = ('some'.match(/^([a-z0-9]+)(\*)?$/i) || []).slice(1).filter(Boolean);
const match2 = ('some*'.match(/^([a-z0-9]+)(\*)?$/i) || []).slice(1).filter(Boolean);

console.log(match1);
console.log(match2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多