匹配两个不同的规则(javascript regexp)

时间:2019-01-07 00:15:44

标签: javascript regex

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

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

我计划获取字符串“ some”和“ *”,同样,如果您搜索的某个单词末尾没有星号,则必须仅找到该单词。

1 个答案:

答案 0 :(得分: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);