Использование обратной ссылки для ссылки на шаблон, а не на фактическое совпадение - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь написать регулярное выражение, которое будет соответствовать (не обязательно повторяющейся) последовательности текстовых блоков, например:

foo,bar,foo,bar

Моя первоначальная мысль заключалась в использовании обратных ссылок, что-токак

(foo|bar)(,\1)*

Но оказывается, что это регулярное выражение соответствует только foo,foo или bar,bar, но не foo,bar или bar,foo (и т. д.).

Есть ли другой способ ссылаться на часть шаблона?

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

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

С приличным регулярным выражением вы можете использовать (foo|bar)(?:,(?-1))* или что-то подобное. Но Java не поддерживает вызовы подшаблона.

Таким образом, в конечном итоге вы можете выбрать замену / форматирование String, как в ответе ajx, или вы можете поставить запятую в условие, если знаете, когда она должна присутствовать, а когда нет. Например:

(?:(?:foo|bar)(?:,(?!$|\s)|))+
1 голос
/ 01 марта 2012

Возможно, вы можете построить свое регулярное выражение в Java, например:

String subRegex = "foo|bar";
String fullRegex = String.format("(%1$s)(,(%1$s))*", subRegex);

Вторая строка может быть выделена в функцию.Функция получит подвыражение и вернет полное регулярное выражение, которое будет соответствовать списку подвыражений через запятую.

0 голосов
/ 01 марта 2012

Суть обратной ссылки в том, чтобы соответствовать фактическому тексту, который соответствует, а не шаблону, поэтому я не уверен, что вы могли бы использовать это.

Можете ли вы использовать квантификаторы, такие как:

    String s= "foo,bar,foo,bar";
            String externalPattern = "(foo|bar)"; // comes from somewhere else
            Pattern p = Pattern.compile(externalPattern+","+externalPattern+"*");
    Matcher m = p.matcher(s);
    boolean b = m.find();

, что соответствует 2 или более экземплярам foo или bar (с последующими запятыми)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...