2

我正在尝试匹配 *xxx 模式,例如“*test”、“*love”、“*anything”(如主题标签)

我基本上试过:

"*aaa *eee *rrr *ttt".match(/(\s|^)(\*[a-z0-9]{3,150})(\s|$)/img)

只返回奇数逻辑匹配:“*aaa”和“*rrr”

匹配时,我猜引擎将整个匹配数字“标记”为“已使用”,因此从测试中删除到下一个块。所以,什么可以是“无”数字,因为开始“^”不存在,并且在第二场比赛之前没有任何东西。

有没有人有解决它的想法?

4

5 回答 5

2

match不是真正适合这里工作的工具。每个项目都需要额外的解析或修剪,所以你最好exec从一开始就使用 while 循环。

var match,
    tags = [],
    str = "*aaa *eee *rrr *ttt",
    reg = /(?:\s|^)(\*[a-z0-9]{3,150})\b/gim;

while (match = reg.exec(str))
    tags.push(match[1]);

console.log(tags)
//-> ["*aaa", "*eee", "*rrr", "*ttt"]

请注意,在正则表达式中,\b表示单词边界,(?:\s|^)表示匹配但不捕获\sor ^。后者确保它match[1]始终是标签。

于 2013-06-21T15:50:12.787 回答
2

试试这个:

/(?:^|\s)(\*[a-z0-9]{3,150})(?=$|\s)/gim

在此处查看演示

用法:

var match, regex = /(?:^|\s)(\*[a-z0-9]{3,150})(?=$|\s)/gim
while (match = regex.exec("*aaa *eee *rrr *ttt *xxx@ hhh*iii *uuu*ooo *www")) {
    console.log(match[1]);
}

输出(匹配的“标签”):

*aaa
*eee
*rrr
*ttt
*www
于 2013-06-22T23:02:55.637 回答
1

问题是空间被前一场比赛消耗,因此当前比赛不可用。

您可以使用前瞻 -(?=\s|$)而不是(\s|$). 尝试:

(\s|^)(\*[a-z0-9]{3,150})(?=\s|$)

有关前瞻的更多信息,请参阅内容。

测试

但在这种情况下,您可以完全删除对以下空格的检查,因为[a-z0-9]无法匹配空格。在此之后,另一个选项是将其更改为:(如果这符合您的要求)

(\s|^)(\*[^\s]{3,150})

[^\s]表示不是空白。

于 2013-06-21T15:35:50.033 回答
1

尝试将正则表达式更改为/(\*[a-z0-9]{3,150})/img

看看它在行动:http ://regexr.com?35ae3

编辑:根据@AndyE 的建议,正则表达式可以写成/(?:\s+|^)(\*[a-z0-9]{3,150})/imghttp ://regexr.com?35aec

于 2013-06-21T15:34:04.900 回答
0

\s从您的正则表达式中删除。你正在抓住开始和结束的空间,所以当你到达时*eee没有开始空间。

(\s|^)(\*[a-z0-9]{3,150})(|$)

例子:

http://regexr.com?35ae0

编辑

您也可以在后面\s添加{0,},这意味着它将查找任意长度的空白。

/(\s{0,}|^)(\*[a-z0-9]{3,150})(\s{0,}|$)/gim

示例:http ://regexr.com?35ae9

于 2013-06-21T15:34:18.880 回答