正则表达式匹配字符串内容,直到评论

时间:2011-06-06 23:02:54

标签: c# .net regex regex-negation

我正在尝试匹配字符串中[%___%]中包含的表达式,而//(注释)除了引号内的//之前(字符串内) 例如, [%tag%] = "a" + "//" + [%tag2%]; //[%tag3%]
应该与[%tag%][%tag2%]

相匹配

我最接近的是^(?:(?:\[%([^%\]\[]*)%\])|[^"]|"[^"]*")*?(?://)

所以我遇到的问题是,这与//中没有结尾的任何字符串不匹配 事实上,它汇总了行,直到它可以在包含//的一个中结束 我试图在最后使用?.*?$解决此问题,以表示//没有必要并转到第一个结束行,但它并没有真正起作用。

其次,它只捕获第二个标签。这不是因为"//",因为即使使用[%1%] [%2%]它也不会捕获第一个

我正在使用带有Regex.Matches选项的C#和RegexOptions.Multiline,这是我的转义字符串

"^(?:(?:\\[%([^%\\]\\[]*)%\\])|[^\"]|\"[^\"]*\")*?(?://)"

2 个答案:

答案 0 :(得分:2)

首先,我要说我喜欢正则表达式。我在Friedl's Mastering Regular Expressions年前读过,从未回头。话虽如此,使用一个巨大的正则表达式来解决这个问题。使用您的编程语言。您最终会得到更易读和可维护的代码。看起来您正在尝试解析不同规则适用于不同环境的语言。您的模式可能出现在带引号的字符串中。带引号的字符串可能在其中包含需要转义的引号。捕捉一个正则表达式中的所有细微之处将是一场噩梦。我建议逐个字符地迭代字符串,沿途构建标记,查找引号,并跟踪您是否在引用的字符串中。当您遇到符合条件的令牌时(您可以对此部分使用正则表达式),并且您不在字符串中,请将其添加到列表中。当您点击一个语句的结尾并遇到评论的开头时,丢弃剩余的字符直到评论结束。

答案 1 :(得分:1)

我认为一次性完成此操作有点困难,因为双引号匹配很难检查。您可以分两个阶段完成:

¤删除所有匹配的双引号
¤找到你的模式

Regex re1 = new Regex(@"""[^""]*""", RegexOptions.Multiline);
Regex re2 = new Regex(@"(?<!//.*)\[%\w+%\]", RegexOptions.Multiline);
string input = @"[%tag%] = ""a"" + ""//"" + [%tag2%]; //[%tag3%]
[%tag%] = ""a"" + ""ii//"" + [%tag2%]; //[%tag3%]";

MatchCollection ms = re2.Matches(re1.Replace(input, ""));