Регулярные выражения или синтаксический анализ строк для вложенных скобок

Рассмотрим следующую строку в качестве входных данных. Второе и третье И являются избыточными. Я хочу удалить его.

Вход

 AND(AND(string("test message")),filter(AND(OR(source:string("XYZ"),source:string("ABC")))))

Я хочу, чтобы вывод был как

 AND(string("test message"),filter(OR(source:string("XYZ"),source:string("ABC"))))

В основном во входной строке используется оператор AND, но указан только один аргумент, что делает ввод недопустимой строкой. Я хочу изменить строку, чтобы удалить И, чтобы в ней был указан только один аргумент.

Каким должен быть лучший подход. Регулярные выражения или синтаксический анализ строк. Моя строка может быть очень длинной.

Я проверил несколько сообщений и, похоже, регулярное выражение не рекомендуется, особенно если оно слишком много вложено.

Пожалуйста, предложите лучший способ справиться с этим случаем.

Некоторый ввод и их вывод

1. И(строка(""тестовое сообщение""))

string(""test message"")
  1. И(И(строка(""тестовое сообщение")),фильтр(И(ИЛИ(источник:строка(""XYZ"")),источник:строка(""ABC""))))))

    И(строка(""тестовое сообщение""),фильтр(ИЛИ(источник:строка(""XYZ"")),источник:строка(""ABC""))))

  2. И(строка(""тестовое сообщение""),фильтр(ИЛИ(источник:строка(""XYZ"")),источник:строка(""ABC"")))) И(строка(""тестовое сообщение"" ),фильтр(ИЛИ(источник:строка(""XYZ"")),источник:строка(""ABC""))))

Анну


person Annu Mittal    schedule 28.03.2014    source источник
comment
вы хотите удалить только второй и третий AND ? ничего больше или меньше?   -  person aelor    schedule 28.03.2014
comment
Не хотели бы вы также удалить связанную скобку?   -  person sshashank124    schedule 28.03.2014
comment
@ sshashank124 - да, я хочу удалить связанную скобку   -  person Annu Mittal    schedule 28.03.2014
comment
В таком случае я сомневаюсь, что вы сможете сделать это только с помощью regex. Вам понадобится специальная функция для этой цели   -  person sshashank124    schedule 28.03.2014
comment
@aelor - в строке может быть использовано N операторов И. В основном я хочу узнать оператор AND, у которого есть только один аргумент. Вот вторая и третья входная строка И недействительны, так как она имеет только один вход   -  person Annu Mittal    schedule 28.03.2014


Ответы (2)


Если вы пойдете по маршруту регулярного выражения, то может сработать положительный прогноз, за ​​которым следует негативный прогноз:

string result = Regex.Replace(searchText, "(?i)(?x)(?(?<!AND\\()AND\\()|(?(?=\\){2})(?!\\){3})\\))", "");

Вход:

AND(AND(string("test message")),filter(AND(OR(source:string("XYZ"),source:string("ABC")))))

AND(string(""test message""))

AND(string(""test message""),filter(OR(source:string(""XYZ""),source:string(""ABC"")))) 

Результат:

AND(string("test message"),filter(OR(source:string("XYZ"),source:string("ABC"))))

string(""test message"")

string(""test message""),filter(OR(source:string(""XYZ""),source:string(""ABC""))) 
person l'L'l    schedule 28.03.2014
comment
Спасибо, это сработало, но для конкретного ввода. В основном я хочу проверить ввод пользователя. Рассмотрим эту строку AND(string(test message)) . Это недопустимая строка, потому что И используется двумя значениями, которые не упоминаются, я хочу удалить такой оператор/строку И. поэтому вывод будет строкой (тестовое сообщение). Не могли бы вы дать регулярное выражение для этого - person Annu Mittal; 28.03.2014
comment
это просто - вы можете использовать шаблон, который я создал, и изменить его на свое усмотрение. (AND\\()|(?=\\){2})\\) приведет к string(""test message""). Обратите внимание, что я немного изменил AND, сдвинув (, и удалил условный положительный/отрицательный просмотр вперед. По сути, шаблон аналогичен этому, но модифицированному для C#. Поиграйте с ним, и вы быстро поймете, как он работает; волшебная формула для вашего исходного вопроса на самом деле заключается в условном положительном/отрицательном прогнозе, который я использовал. 2-й пример - это всего лишь пара кусочков. - person l'L'l; 28.03.2014
comment
Вот пример, с которым вы можете работать над своим первым вопросом. Замените AND в шаблоне на THIS, и вы заметите, как он обрабатывает дополнительное выражение. Разница в шаблонах заключается в том, что в C# необходимо использовать два escape-символа `\` вместо одного. - person l'L'l; 28.03.2014
comment
он удалил все И, мое требование отличается, когда я указываю И, тогда ему могут быть переданы или не переданы два или более аргумента, если есть только один аргумент, я хочу удалить И, если передано два или более аргумента тогда не хочу ничего делать - person Annu Mittal; 28.03.2014
comment
Добавлен некоторый ввод-вывод, пожалуйста, проверьте исходный вопрос - person Annu Mittal; 28.03.2014
comment
Ну, я не уверен, что полностью понимаю вашу логику, хотя я обновил свой ответ; Он должен обрабатывать несколько шаблонов, которые вы добавили к своему вопросу. - person l'L'l; 28.03.2014

person    schedule
comment
спасибо за ваш ответ, можете ли вы регулярное выражение, которое я могу использовать с С# - person Annu Mittal; 28.03.2014
comment
Я не знаком с С#, но просто проверьте команду regex.replace и попробуйте - person Pac; 28.03.2014