似乎无法得到这个 - 我试图想出一个匹配字符串的正则表达式,如果它包含" *"在任何位置,但不是如果星号前面有反斜杠。 例如:
abcd: false
*abcd: true
abcde*fghi*: true
abc\*defg: false
\*abcdefg: false
我认为我已经走上了正确的道路,但它不起作用:
/[^\\]\*/
谢谢!
答案 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)
答案 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)
请记住,改建的两边都是匹配的;你可以通过在比赛结束后检查组(1)来区分。