所以我有(matlab)代码..而且行之后没有(;)行
我想找到那条线
表示首发:
sad= sdfsdf ; %this is comment
sad = awaww ;
n= sdfdsfd ;
m = (asd + adsf(asd,asd)) %this is comment
我想说要找到第4行,因为它在行尾没有(;)..
到目前为止我坚持这一点:
/(^[-a-zA-Z0-9]+\s*=[-a-zA-Z0-9@:%,_\+.()~#?&//= ]+)(?!;)$/gim
所以这样可以正常工作..它只会找到第四行 但是,如果我想要(;)在行的中间但不是在结尾或在评论之前...?
w=sss (;)aaa **;** % i dont want this line to be selected
w=sss (;)aaa %i want this line to be selected
答案 0 :(得分:3)
好吧,让我们找到以分号结尾的所有行:
^.+?;
可选地后跟水平空格:
^.+?;[ \t]*
和可选评论:
^.+?;[ \t]*(?:%.*)?
此表达式可轻松匹配您不所需的所有行。所以,逆转它:
^(?!.+?;[ \t]*(?:%.*)?$).+
不幸的是,这太容易了。它无法匹配注释中包含分号的行。我们可以将.+?
替换为[^%\r\n]+?
,但这会在字符串中包含%
的行上失败。
如果您需要更强大的模式,则必须考虑所有这些。
所以让我们以同样的方式开始,通过定义“正确”线应该是什么样子。我将使用PCRE语法进行原子分组,因此您必须使用perl = TRUE
。
'(?>[^']+|'')*'
[^%';\r\n]+
所以“普通”代码是:
(?>[^%';\r\n]+|'(?>[^']+|'')*'|;)+?
然后,我们添加所需的分号和可选注释:
(?>[^%';\r\n]+|'(?>[^']+|'')*'|;)+?;[ \t]*(?:%.*)?$
最后,我们颠倒了所有这些:
^(?!(?>[^%';\r\n]+|'(?>[^']+|'')*'|;)+?;[ \t]*(?:%.*)?$).+
我们有最终模式。 Demo
您不需要完全标记输入,您只需要识别不同的“词法模式”。我希望处理字符串和注释就足够了,但我没有彻底检查Matlab语法。
您可以将其与不支持原子组的其他正则表达式引擎一起使用,将(?>
替换为(?:
,但您将面临catastrophic backtracking问题。