我在正则表达式中需要帮助

时间:2015-12-26 08:13:35

标签: regex matlab

所以我有(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

http://regexr.com/3cfor

1 个答案:

答案 0 :(得分:3)

好吧,让我们找到以分号结尾的所有行:

^.+?;

可选地后跟水平空格:

^.+?;[ \t]*

和可选评论:

^.+?;[ \t]*(?:%.*)?

此表达式可轻松匹配您所需的所有行。所以,逆转它:

^(?!.+?;[ \t]*(?:%.*)?$).+

不幸的是,这太容易了。它无法匹配注释中包含分号的行。我们可以将.+?替换为[^%\r\n]+?,但这会在字符串中包含%的行上失败。

如果您需要更强大的模式,则必须考虑所有这些。

所以让我们以同样的方式开始,通过定义“正确”线应该是什么样子。我将使用PCRE语法进行原子分组,因此您必须使用perl = TRUE

  • 字符串为:'(?>[^']+|'')*'
  • 其他代码(字符串,注释和分号除外)包含在:[^%';\r\n]+

所以“普通”代码是:

(?>[^%';\r\n]+|'(?>[^']+|'')*'|;)+?

然后,我们添加所需的分号和可选注释:

(?>[^%';\r\n]+|'(?>[^']+|'')*'|;)+?;[ \t]*(?:%.*)?$

最后,我们颠倒了所有这些:

^(?!(?>[^%';\r\n]+|'(?>[^']+|'')*'|;)+?;[ \t]*(?:%.*)?$).+

我们有最终模式。 Demo

您不需要完全标记输入,您只需要识别不同的“词法模式”。我希望处理字符串和注释就足够了,但我没有彻底检查Matlab语法。

您可以将其与不支持原子组的其他正则表达式引擎一起使用,将(?>替换为(?:,但您将面临catastrophic backtracking问题。