Java Regexp обсуждение2 - PullRequest
       1

Java Regexp обсуждение2

0 голосов
/ 14 ноября 2011

Наличие этого шаблона для регулярного выражения:

Pattern p = Pattern.compile("[^\\.](?s)executeRule\\(\\s*?(.+?),\\s*?('.+?'),\\s*(\\[.+?\\]\\s*\\);)");

У меня есть текст вроде:

setSomething(false);
executeRule(document, 'PublishDocumentsToEmail', [
    'xmlMapping':'xmlmapping.TagRegLike',
    'emailAddress':'EMAIL(mymail@mail.com)',
    'emailSubject':'Test',
    'emailText':'test',
    'filenameSuffix':'test']
);

System.out.println("bla");

executeRule(document, 'PublishDocumentsToJMS', [
    'xmlMapping':'xmlmapping.TagRegLike',
    'emailAddress':'EMAIL(mymail@mail.com)',
    'emailSubject':'Test',
    'emailText':'test',
    'filenameSuffix':'test']
);

Я хочу найти последовательности, содержащие шаблон executeRule. Мое регулярное выражение успешно находит только первое появление образца; все шаблоны, которые следуют за этим первым шаблоном, будут содержать предыдущие шаблоны.

например. в первый раз, когда я анализирую, я нахожу

executeRule(document, 'PublishDocumentsToEmail', [
    'xmlMapping':'xmlmapping.TagRegLike',
    'emailAddress':'EMAIL(mymail@mail.com)',
    'emailSubject':'Test',
    'emailText':'test',
    'filenameSuffix':'test']
);

Я делаю некоторые замены в шаблоне, чтобы он стал

executeRule(document, 'PublishDocumentsToEmail', [
        'xmlMapping':'xmlmapping.TagRegLike',
        'emailAddress':'EMAIL(mymail@mail.com)',
        'emailSubject':'Test',
        'emailText':'test',
        'filenameSuffix':'test']
         ,crs
    );

После этого я рекурсивно вызываю тот же метод разбора с новым текстом, который

setSomething(false);
executeRule(document, 'PublishDocumentsToEmail', [
    'xmlMapping':'xmlmapping.TagRegLike',
    'emailAddress':'EMAIL(mymail@mail.com)',
    'emailSubject':'Test',
    'emailText':'test',
    'filenameSuffix':'test']
    ,crs
);

System.out.println("bla");

executeRule(document, 'PublishDocumentsToJMS', [
    'xmlMapping':'xmlmapping.TagRegLike',
    'emailAddress':'EMAIL(mymail@mail.com)',
    'emailSubject':'Test',
    'emailText':'test',
    'filenameSuffix':'test']
);

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

executeRule(document, 'PublishDocumentsToEmail', [
    'xmlMapping':'xmlmapping.TagRegLike',
    'emailAddress':'EMAIL(mymail@mail.com)',
    'emailSubject':'Test',
    'emailText':'test',
    'filenameSuffix':'test']
    ,crs
);

System.out.println("bla");

executeRule(document, 'PublishDocumentsToJMS', [
    'xmlMapping':'xmlmapping.TagRegLike',
    'emailAddress':'EMAIL(mymail@mail.com)',
    'emailSubject':'Test',
    'emailText':'test',
    'filenameSuffix':'test']
);

Как сделать так, чтобы он соответствовал только моему второму шаблону?

Thx

Ответы [ 3 ]

1 голос
/ 14 ноября 2011

Я не полностью прочитал ваши примеры, но вы можете либо использовать \G в своем паттерне, чтобы начать после последнего матча, либо просто перебрать совпадения при использовании Matcher#find().

Надеюсь, что это поможет.

Обновление :

После этого я рекурсивно вызываю тот же метод синтаксического анализа с новым текстом, который ...

Почему вы называете это рекурсивно?Я не вижу никакой рекурсии, поэтому вы можете просто перебрать совпадения, найденные в первом вызове.

0 голосов
/ 14 ноября 2011

Это все, что вы пытаетесь сделать, добавить ,crs в качестве последней строки из всех executeRule строк с той же структурой? Это достаточно просто:

s = s.replaceAll("(?m)^executeRule\\([^\\[]*\\[(\\s*)[^\\]]*\\]", "$0$1,crs");

Я просто сопоставил все до закрытия ] (захватывая образец некоторого начального пробела по пути), затем снова подключил его и добавил строку ,crs. Если ваши потребности более сложны, чем это, вам нужно сказать нам точно, что они есть. Но я уверен, что будет лучшее решение, чем сделать несколько проходов по входу, как вы делаете сейчас.

0 голосов
/ 14 ноября 2011

Просто используйте find(index), где index - после первого / уже измененного вхождения.

Matcher.find (INT)

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