Мне нужно заменить список токенов, таких как 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
Поскольку я могу сопоставлять простые токены и могу сопоставлять эти функции игнорирования, я не могу совместить токены везде, кроме внутренних игнорируемых функций.
Пока я использую следующее regexp для соответствия токенам: ANDALSO|ORELSE|=|<>
И это регулярное выражение для соответствия всем внутри функции игнорирования: \bIgnoreFunction\b (["'])(\\?.)*?\1
Но я не могу определить шаблон, чтобы остановить совпадение метки равенства внутри функций игнорирования.
Heres регулярное выражение, которое я использовал для проверки: TEST (["'])(\\?.)*?\1|(=|AND|OR)
Я протестировал его с помощью этого выражения: Request.Query TEST' [\? & ] th = mm (& | $) '= = = AND ИЛИ на этом сайте: http://regexstorm.net/tester И это соответствует всем, а не только, И, ИЛИ маркерам.
Ярослав, вы говорите, что IgnoreFunction находится в кавычках, но в вашем вопросе цитаты не закрыты, например, в IgnoreFunction 'SomeVar=AnotherVar ANDALSO test = anotherTest
. Я собираюсь предположить, что это опечатка.
Кроме того, вы сказали, что хотите заменить ANDALSO
на &&
. Для иллюстрации, я также собираюсь предположить, что вы хотите заменить ORELSE
на ||
Здесь наше регулярное выражение:
IgnoreFunction\s*(['"])[^']*\1|AlsoIgnoreFunction\[[^\]]*\]|(ANDALSO|ORELSE)
Левая часть чередования соответствует полным выражениям IgnoreFunction
и AlsoIgnoreFunction
. Мы проигнорируем эти матчи. Правая сторона сопоставляет и фиксирует ANDALSO
и ORELSE
для группы 2, и мы знаем, что они правильные, потому что они не соответствовали выражениям слева.
Эта программа показывает, как использовать регулярное выражение (см. Результаты в нижней части онлайн-демонстрации):
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
Справка
Как сопоставить (или заменить) шаблон, за исключением ситуаций s1, s2, s3...