Вложенные Lookarounds в регулярном выражении Java - PullRequest
0 голосов
/ 02 февраля 2012

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

, другими словами, для строки темы

xxxcabyyy

мое регулярное выражение выглядит как

String myregex = ((?<=xxx)cab(?=[y]+))

поэтому я хочу использовать это регулярное выражение более одного раза, потому что, возможно, я ищу что-то еще, например

(test string) xxxcabyyy

Я хочу регулярное выражение, подобное

"\(test string\)(?=" + myregex + ")"

сказать "найти (тестовая строка)", которая предшествует тому, что соответствовало моему регулярному выражению.

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

Ответы [ 3 ]

1 голос
/ 02 февраля 2012

Можно помещать обходные пути в другие обходные пути, но я не понимаю, зачем вам это нужно. На самом деле, я не вижу необходимости в периоде ожидания. Разве это не работает?

"\\(test string\\)\s*xxx(cab)y+"

Предполагая, что это интересующая вас часть cab, вы можете извлечь ее через Matcher#group(1).

0 голосов
/ 02 февраля 2012

Если вам нужно решение с поиском в других поисках, вы можете сделать

\(test string\)(?=.*?((?<=xxx)cab(?=[y]+)))

или если за (test string) следуют xxxcabyyy и между пробелами , между которыми вы хотите:

\(test string\)(?= *((?<=xxx)cab(?=[y]+)))

Это потому, что в точке, в которой вы соответствуете (test string), еще есть символы, которые нужно использовать, прежде чем вы нажмете xxxcabyyy, и вам придется включить их в свой прогноз.

0 голосов
/ 02 февраля 2012

Ваше предположение верно - это не сработает, потому что вы уже указали конструкции lookbehind и lookahead в вашей строке myregex. Одним из способов решения этой проблемы является сохранение отдельных строк для того, что вы хотите для конструкций lookbehind и lookahead, и использование их для построения окончательной строки регулярного выражения непосредственно перед тем, как вам нужно будет выполнить сопоставление. Например, вы могли бы написать такой метод, как следующий, который будет возвращать строку регулярного выражения с учетом конструкций lookbehind и lookahead и того, что между ними должно совпадать:

public static String lookaroundRegex(String behind, String match, String ahead) {
    return "((?<=" + behind + ")" + match + "(?=" + ahead + "))";
}

Вы можете использовать его следующим образом:

String behind = "xxx";
String ahead = "[y]+";
String match = "cab";

// For the first case:
Pattern regexPattern1 = Pattern.compile(lookaroundRegex(behind, match, ahead));

// For the second case:
String behind2 = "\\(test string\\) " + behind;
Pattern regexPattern2 = Pattern.compile(lookaroundRegex(behind2, match, ahead));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...