Javascript 一组字符串不应位于第一个看到的字符串的左侧;
此字符串(Javascript 一组字符串不应位于第一个看到的字符串的左侧;,javascript,regex,Javascript,Regex,此字符串(kwordSyntaxSearch)应通过以下条件: ( sdf sdf ) cout<<"abc"; return 0; } ( sdf sdf ) cout<<"abc" return 0; } 这是我上一个问题中username:f-j答案的修改条件,但我意识到我需要更多帮助。这通过了第二段代码(w/c不应该) 我想通过条件,如果第一个没有看到任何if,else,else if,for,while,do,switch,},return(在其左侧)
kwordSyntaxSearch
)应通过以下条件:
( sdf sdf )
cout<<"abc";
return 0;
}
( sdf sdf )
cout<<"abc"
return 0;
}
这是我上一个问题中username:f-j答案的修改条件,但我意识到我需要更多帮助。这通过了第二段代码(w/c不应该)
我想通过条件,如果第一个
没有看到任何if,else,else if,for,while,do,switch,},return
(在其左侧)
你能帮我调整代码,使它能通过第一个块而不是第二个块吗。前瞻部分似乎有点错误。不考虑长时间的交替,你的有结构
(?:(?!...)|[\s\S]*)
首先,前瞻是完全可选的,甚至不能带你去任何地方,因为它不消耗字符,所以它从来没有被使用过。然后,即使删除了|
,也只需检查一次条件,然后在[\s\s]*
处进行匹配。您需要将*
拉到非捕获组之外,以便在每个位置检查条件,如下所示:
(?:(?!...)[\s\S])*
这是模拟[^a]*
的一种非常常见的模式,您希望排除比单个字符a
更复杂的内容。所以,你的整个图案看起来像
^\s*\([\s\S]*\)\s*[^\{](?:(?!if|else|elseif|for|while|do|switch|\}|return)[\s\S])*;
或
请注意,我还删除了
[^\s\s]
,因为它无法匹配任何内容。您确定可以使用正则表达式执行整个sytax检查吗?看起来您正在实现某种特定于领域的语言。也许你应该考虑使用分析器生成器,例如,这是C++初学者,一个模拟变量值的系统。这是我认为最难的部分。^完全等同于\s\s吗?我什么时候确切地放置\b,这样如果字符串包含“switcher”,它就不会是一个problem@fireflieslive第一个问题,没有,但是[^]
在JS中完全等同于[\s\s]
。在单词周围使用\b
。如\b开关\b
。要对所有单词执行此操作,可以使用(?!\b(?:if | else |…)\b)
。
^\s*\([\s\S]*\)\s*[^\{](?:(?!if|else|elseif|for|while|do|switch|\}|return)[\s\S])*;
^\s*\([^]*\)\s*[^{](?:(?!if|else|elseif|for|while|do|switch|}|return)[^])*;