0

我的模式在第一次匹配后停止,并且在那里有全局匹配。

//When I add [*]* like var pattern=/([^A-z0-9]|^|[*]*)_(\S.*?)_((?!\S)|\W)/g;
//  it works, but when I try to match "1_test1_" and "a_test1_" it matches "_test1_"
//  which I don't want. I know [*]* will match 0 or more instances of literal *
//  but [*]+ won't work due to the first match being "_test1_*"

var pattern=/([^A-z0-9]|^)_(\S.*?)_((?!\S)|\W)/g;

alert("_test1_*_test2_".match(pattern)); //=> _test1_*
    //This should match "_test1_*" first then it should also add to the array with "_test2_"

问题开始

我希望上面的(第一个代码块)提醒“_test1_*,_test2_”,我希望下面的(第二个代码块)保持不变(如注释部分所示)。

我不知道为什么 _test2_ 不匹配,因为它与下面显示的测试完全匹配。

问题完成

以下是应有的测试和工作。

alert("_test1_ _test2_".match(pattern)); //=> _test1_, _test2_
alert("_test1_*".match(pattern)); //=> _test1_*
alert("_test2_".match(pattern)); //=> _test2_
alert("*_test2_".match(pattern)); //=> *_test2_
alert("1_test1_".match(pattern)); //=> null
alert("a_test1_".match(pattern)); //=> null
alert("_test1_1".match(pattern)); //=> null
alert("_test1_a".match(pattern)); //=> null
4

3 回答 3

0

我认为模式应该改变。这个怎么样?在下划线之前需要可选符号字符的部分之后放置一个问号:

([^A-z0-9]|^)?_(\S.*?)_((?!\S)|\W)
于 2012-12-12T02:44:39.980 回答
0

好的,那么如何使用这个序列,不知道它是否是你正在寻找的:

([^A-z0-9]|^|)_(\S.*?)_((?!\S)|\W)

我刚刚在正则表达式中的字符串开头符号之后添加了一个额外的 vert 行,正在测试您的非工作案例并且可以正常工作。

顺便说一句,我使用 regexpal.com 来测试正则表达式。

于 2012-12-12T05:04:12.417 回答
0

经过多次反复试验,我终于通过添加 |\b 找到了答案。感谢@Alih Nehpets 尝试回答我的问题。

([^A-z0-9]|^|\b)_(\S.*?)_((?!\S)|\W)
于 2012-12-12T22:30:10.533 回答