c # regexp заменяет токены, кроме тех, что в скобках

1

Мне нужно заменить список токенов, таких как 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 И это соответствует всем, а не только, И, ИЛИ маркерам.

Теги:

1 ответ

1
Лучший ответ

Ярослав, вы говорите, что 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...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню