JavaScript RegEx匹配" *",除非以反斜杠开头

时间:2015-05-04 18:48:43

标签: javascript regex

似乎无法得到这个 - 我试图想出一个匹配字符串的正则表达式,如果它包含" *"在任何位置,但不是如果星号前面有反斜杠。 例如:

abcd: false
*abcd: true
abcde*fghi*: true
abc\*defg: false
\*abcdefg: false

我认为我已经走上了正确的道路,但它不起作用:

/[^\\]\*/

谢谢!

6 个答案:

答案 0 :(得分:8)

这听起来不是那么简单。

如果反斜杠本身被反击怎么办?

 \\* should be true, while
  \* this should be false

事实上,问题确实是一个递归的问题。但是通过考虑反斜杠本身,后跟星号,可以避免递归,后视和所有复杂性。

/(?:^|[^\\])((\\\\)*\*)/.test(string);
/* returns true for unescaped asterisks */

示例:

abcd false
*abcd true
\*abcd false
\\*abcd true
\\\*abcd false
\\\\*abcd true

答案 1 :(得分:3)

虽然在这种情况下一个简单的/(^|[^\\])\*/应该可以解决问题,但我喜欢让事情更简单。

var matches = line.indexOf("*") >= 0 && line.indexOf("\\*") < 0;

非常字面意思:如果该行包含*且不包含\*,那么您就是好人!

答案 2 :(得分:1)

\S*(?:^|[^\\\s])\*\S*

你可以尝试一下。参见演示。

https://regex101.com/r/uE3cC4/32

答案 3 :(得分:1)

你的正则表达式应该有效。事实上,这是{工作)regex101

Javascript不支持lookbehinds,这是编写此类正则表达式的最佳方式。所以你所拥有的就足够了,虽然它在星号之前需要某些东西 - 它不能是第一个字符。

答案 4 :(得分:1)

可悲的是,JavaScript不支持lookbehinds,但这里有一个应该有效的正则表达式:

/(?:^|[^\\])\*/

说明:

(?:^|[^\\]) - 非捕获组捕获字符串的开头或\以外的字符。

\* - 后面跟一个星号。

以下是您的示例演示:

var unescapedAsterisk = /(?:^|[^\\])\*/;

['abcd', '*abcd', 'abcde*fghi*', 'abc\\*defg', '\\*abcdefg'].forEach(function(str){
    console.log(str,  unescapedAsterisk.test(str));
});

答案 5 :(得分:0)

The Greatest Regex Trick Ever的静脉中,只需改变类型:

for

然后检查组(1)

的真实性

所以,正则表达式是:

what I dont want | (what I do want)

Demo

请记住,改建的两边都是匹配的;你可以通过在比赛结束后检查组(1)来区分。