繁体   English   中英

匹配注释,除非起始字符被未转义的引号包围

[英]Match comments unless the initiating character is surrounded by unescaped quotes

使用正则表达式:如何匹配以分号开头的注释,除非分号两边都被未转义的引号包围,如下所示(绿色块表示匹配的注释)?:

示例输入和输出

请注意,双引号可以通过将它们加倍""来转义。 这样的转义双引号表现为完全不同的字符,即它们无法包围分号并禁用其注释开始 function。

此外,不平衡的双引号被视为转义双引号。

在 Bubble 的帮助下,我已经了解了下面的正则表达式,它无法正确处理最后一个测试向量行中尾随的转义双引号。

^(?>(?:""[^""\n]*""|[^;""\n]+)*)""?[^"";\n]*(;.*)

看它在这里运行。

测试向量(与上面的颜色编码图中相同):

Peekaboo ; A comment starts with a semicolon and continues till the EOL
Unless the semicolon is surrounded by dquotes ”Don’t do it ; here” ;but match me; once
Im not surrounded ”so pay attention to me” ; ”peekaboo”
Im not surrounded ”so pay attention” to;me” ; ”peekaboo”
Im not surrounded ”so pay attention to me ; peekaboo
Dquote escapes a dquote so ”dont pay attention to ””me;here”” buster” do it ; here
Don’t pay attention to  ”””me;here””” but do ””it;here””
and ”dont do ””it;here”””  either ;peekaboo
but "pay attention to "it;here"" ;not here though
Simon said ”I like goats” then he added ”and sheep;” ;a good comment is ”here
Simon said ”I like goats” then he added ”and sheep;” dont do it here
Simon said ””I like goats;”peekaboo
Simon said ”I like goats;””peekaboo

任务是找到;开头的评论。 考虑到""转义引号和之前潜在的非闭合引号,引号外的分号 这种方法适用于尚未提供的测试用例。

更新模式更短、更高效的无交替变体。

^((?>(?:(?:[^"\n;]*"[^"\n]*")+(?!"))?[^"\n;]*)"?[^"\n;]*);.*

regex101 的新演示

此模式无需交替即可工作,并使用否定前瞻来检查最后一个有效的双引号。 在这两种模式中,原子组模仿所有格量词以防止任何回溯并保持平衡。 使用所有格量词,模式看起来像这个 regex101 演示 [^";\n]*"?[^";\n]*是允许可选的非闭合引号的部分。


以前的模式结果证明这是可靠的,但速度有点慢。

^((?>(?:(?:[^;"\n]*"(?>(?:[^"\n]+|"")*)")+)?)[^";\n]*"?[^";\n]*);.*

regex101 的旧演示

"(([^"]+|"")*)"消耗" ... """ 。这会与任何[^;"]*不是的字符重复任意次数; "介于两者之间。所有这些都是在原子组内完成的。由于使用原子组,将引用的部分与中间的任何非分号匹配,没有办法返回。最终允许可选的非封闭"要么是一个; 将被发现或失败。


一个捕获组$1包含到 targeted 的部分; 评论开始 要删除评论,请将完整匹配替换为捕获的部分。 如果需要捕获(.*)第二组

正则表达式部分 火柴
(?> ... ) 表示一个原子组,用于防止任何进一步的回溯
[^ ... ] 否定字符 class匹配不在列表中的单个字符
( ... )(?: ... ) 捕获组和非捕获(后者用于重复交替
量词? * + ? 匹配零个或一个可选), *任意数量+一个或多个

如果替换是在单行上完成的,则可以从任一模式中删除所有\n换行符

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM