Регулярное выражение для сопоставления последовательности символов

#java #regex

#java #регулярное выражение

Вопрос:

Мне нужно регулярное выражение для сопоставления последовательности символов, составляющих запрос. Пример моего определения запроса выглядит следующим образом : и(cat,dog) В более общем определении это может быть представлено как operator (операнд, операнд) Оно состоит из оператора, который содержит 2 операнда. Операндами может быть любое отдельное БУКВЕННОЕ слово (нечисловое) или даже другой подзапрос. и примером является и (козел, или(зебра, медведь)) Операторами являются AND, OR, NOT, и запрос может становиться все более и более НЕОДНОЗНАЧНЫМ настолько, насколько это возможно. В запросе нет ПРОБЕЛОВ, и мне нужно регулярное выражение для использования в приложении Java. Примечание: Оператор NOT может иметь только один операнд, например, not(tiger). Заранее спасибо.

Комментарии:

1. ПОЖАЛУЙСТА, НЕ КРИЧИТЕ. Я исправил ваш заголовок.

2. Лучше пытаться анализировать сложные выражения, такие как запросы, с использованием шаблонов, используя лексические и синтаксические анализаторы, такие как lexx и yacc (bison) в мире C. Это дает вам больше возможностей для определения токенов, которые вы можете использовать, и правил построения (производственных правил в грамматике). Это очень сложно в использовании, но невероятно мощно, если вы можете его использовать. Google для Java с lexx и yacc для Java -альтернатив этим классическим.

Ответ №1:

Подзапрос в качестве операнда делает это невозможным. Регулярные выражения недостаточно эффективны для вложенных файлов, вам нужно будет использовать контекстно-свободные грамматики.

Ответ №2:

Ваша проблема может быть намного сложнее, и трудно угадать ваше точное направление. Однако этот простой пример Java может стать хорошей отправной точкой для вас:

 
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test { 

  public static void main(String[] args) {
    String s = "add(1,sub(2,3))";
    Pattern p = Pattern.compile("(.*?)\((.*)\)");
    Matcher m1 = p.matcher(s);
    if (m1.matches()) {
      System.out.println(m1.group(1));
      System.out.println(m1.group(2));
    }
    System.out.println();
    Matcher m2 = p.matcher(m1.group(2));
    if (m2.matches()) {
      System.out.println(m2.group(1));
      System.out.println(m2.group(2));
    }
  }
}
  

Выдает вывод, подобный:

 
add
1,sub(2,3)

1,sub
2,3