我需要替换令牌列表,例如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,或者令牌。
答案 0 :(得分:1)
雅罗斯拉夫,你说IgnoreFunction是引号,但在你的问题中,引号没有关闭,例如在IgnoreFunction 'SomeVar=AnotherVar ANDALSO test = anotherTest
中。我打算假设这是一个错字。
此外,您已说过要将ANDALSO
替换为&&
。为了便于说明,我还假设您要将ORELSE
替换为||
这是我们的正则表达式:
IgnoreFunction\s*(['"])[^']*\1|AlsoIgnoreFunction\[[^\]]*\]|(ANDALSO|ORELSE)
交替的左侧匹配完整的IgnoreFunction
和AlsoIgnoreFunction
表达式。我们将忽略这些匹配。右侧匹配并捕获ANDALSO
和ORELSE
到组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...