#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