我正在尝试匹配字符串中[%___%]
中包含的表达式,而//
(注释)除了引号内的//
之前(字符串内)
例如,
[%tag%] = "a" + "//" + [%tag2%]; //[%tag3%]
应该与[%tag%]
和[%tag2%]
我最接近的是^(?:(?:\[%([^%\]\[]*)%\])|[^"]|"[^"]*")*?(?://)
所以我遇到的问题是,这与//
中没有结尾的任何字符串不匹配
事实上,它汇总了行,直到它可以在包含//
的一个中结束
我试图在最后使用?.*?$
解决此问题,以表示//
没有必要并转到第一个结束行,但它并没有真正起作用。
其次,它只捕获第二个标签。这不是因为"//"
,因为即使使用[%1%] [%2%]
它也不会捕获第一个
我正在使用带有Regex.Matches
选项的C#和RegexOptions.Multiline
,这是我的转义字符串
"^(?:(?:\\[%([^%\\]\\[]*)%\\])|[^\"]|\"[^\"]*\")*?(?://)"
答案 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, ""));