2

此字符串 ( kwordSyntaxSearch) 应通过条件:

( sdf sdf )
cout<<"abc";

return 0;
}

kwordSyntaxSearch一定不能通过条件:

( sdf sdf )
cout<<"abc"

return 0;
}

这是用户名答案的修改条件:fj from my prev question 但我意识到我需要更多帮助。这通过了第二个代码块(w/c 不应该)

if( /^\s*\([\s\S]*\)\s*[^\{](?:(?![^\s\S]if|else|elseif|for|while|do|switch|\}|return)|[\s\S]*);/.test(kwordSyntaxSearch)

;如果第一个在它之前没有看到任何if,else,else if,for, while,do,switch,},return东西(在它的左侧),我想通过条件

你能帮我调整一下代码,让它通过第一个块而不是第二个块。

4

1 回答 1

0

前瞻部分似乎有点错误。忽略长时间的交替,你的结构

(?:(?!...)|[\s\S]*)

一方面,前瞻是完全可选的,甚至无法将您带到任何地方,因为它不消耗任何字符 - 所以它甚至从未使用过。然后,即使您删除 ,|您也只需检查一次条件,然后在[\s\S]*. 您需要将非捕获组拉到*外部,以便在每个位置检查条件,如下所示:

(?:(?!...)[\s\S])*

这是一种非常常见的模式,可以模拟[^a]*您想要排除比单个字符更复杂的内容的位置a。所以,你的完整模式看起来像

^\s*\([\s\S]*\)\s*[^\{](?:(?!if|else|elseif|for|while|do|switch|\}|return)[\s\S])*;

或者

^\s*\([^]*\)\s*[^{](?:(?!if|else|elseif|for|while|do|switch|}|return)[^])*;

请注意,我还删除了[^\s\S], 因为它永远无法匹配任何东西。

于 2013-08-21T20:09:38.760 回答