c#regex替换标记,括号中除外

时间:2014-05-22 08:00:24

标签: c# regex

我需要替换令牌列表,例如ORELSE,ANDALSO,=,<>。但是我只需要这样做,当他们独自一人时,而不是一个功能。所以

SomeVar ANDALSO SomeOTherVar ANDALSO AnotherVar = 1234

应替换为

SomeVar && SomeOTherVar && AnotherVar == 1234

这就是我可以做的事情。但是我需要忽略某些函数内部的标记,比如

IgnoreFunction 'SomeVar=AnotherVar ANDALSO test = anotherTest。 要么 AlsoIgnoreFunction['test=value', 'anotherTest = anotherValue']

表达式SomeVar ANDALSO SomeOTherVar ANDALSO AnotherVar = 1234 IgnoreFunction 'SomeVar=AnotherVar 应该替换为

SomeVar && SomeOTherVar && AnotherVar == 1234 IgnoreFunction 'SomeVar=AnotherVar

因为我可以匹配简单的令牌并且可以匹配这些忽略函数,所以我无法在任何地方匹配令牌,除了忽略函数内部。

现在我使用以下正则表达式来匹配令牌: ANDALSO|ORELSE|=|<>

这个正则表达式匹配忽略函数内的所有内容: \bIgnoreFunction\b (["'])(\\?.)*?\1

但是我无法找出停止在忽略函数中匹配等式标记的模式。

继承我用来测试它的正则表达式:TEST (["'])(\\?.)*?\1|(=|AND|OR) 我用那个表达式测试了它:Request.Query TEST&#39; [\?&amp;] th = mm(&amp; | $)&#39; = = = AND OR 在此网站上:http://regexstorm.net/tester 它匹配所有东西,不仅仅是=,AND,或者令牌。

1 个答案:

答案 0 :(得分:1)

雅罗斯拉夫,你说IgnoreFunction是引号,但在你的问题中,引号没有关闭,例如在IgnoreFunction 'SomeVar=AnotherVar ANDALSO test = anotherTest中。我打算假设这是一个错字。

此外,您已说过要将ANDALSO替换为&&。为了便于说明,我还假设您要将ORELSE替换为||

这是我们的正则表达式:

IgnoreFunction\s*(['"])[^']*\1|AlsoIgnoreFunction\[[^\]]*\]|(ANDALSO|ORELSE)

交替的左侧匹配完整的IgnoreFunctionAlsoIgnoreFunction表达式。我们将忽略这些匹配。右侧匹配并捕获ANDALSOORELSE到组2,我们知道它们是正确的,因为它们与左侧的表达式不匹配。

此程序显示了如何使用正则表达式(请参阅online demo底部的结果):

using System;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
class Program
{
static void Main()  {
var myRegex = new Regex(@"IgnoreFunction\s*(['""])[^']*\1|AlsoIgnoreFunction\[[^\]]*\]|(ANDALSO|ORELSE)");
string s1 = @"SomeVar ANDALSO SomeOTherVar ANDALSO AnotherVar = 1234 IgnoreFunction 'SomeVar=ANDALSO AnotherVar'
AlsoIgnoreFunction['test=value', 'anotherTest = ANDALSO anotherValue'] ORELSE ANDALSO";

string replaced = myRegex.Replace(s1, delegate(Match m) {
    if (m.Groups[2].Value == "ANDALSO") return "&&";
    else if (m.Groups[2].Value == "ORELSE") return "||";
    else return m.Value;
    });
Console.WriteLine("\n" + "*** Replacements ***");
Console.WriteLine(replaced);


Console.WriteLine("\nPress Any Key to Exit.");
Console.ReadKey();

} // END Main
} // END Program

参考

How to match (or replace) a pattern except in situations s1, s2, s3...