2013-08-09 4 views
1

Мне нужна помощь с этим регулярным выражением. У меня есть строки разной длины, и вы хотите соответствовать только началу. У строк есть символы новой строки, поэтому кажется, что \ A - путь.Java regex " A" border match

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

OPTIONAL: [any whitespace/newlines/etc] 
OPTIONAL: <?.*?> 
OPTIONAL: [any whitespace/newlines/etc] 
MANDAORY: <lemon> 
OPTIONAL: anything afterwards. 

Поскольку струны могут получить огромные, окончательное Дополнительное согласование делает это крайне медленно.

Мое первое решение было:

"(^\\s*<?.*?>\\s*<lemon>)[\\s\\S]*|(^\\s*<lemon>.*)[\\s\\S]*" 

Это крайне запутанным и сопоставляется со всей строкой, а не только в начале

Мой текущий лучший попробовать это:

"\\A(?:\\s*<?.*?>)?\\s*<lemon>" 

Однако это не работает, если есть что-то после mon>, то матч не удался.

У кого-нибудь есть идеи относительно того, почему? Примеры на \A являются скудными, и я не могу заставить его работать.

ответ

0

Что вам не хватает, это понятие группировки. Я принял ваше регулярное выражение и положить его в ( скобки

Pattern p = Pattern.compile("(\\A(?:\\s*<?.*?>)?\\s*<lemon>).*"); 
Matcher m = p.matcher(" <?.*?> <lemon> hi "); 
if (m.find()) { 
    System.out.println(m.group(1)); 
} 

группы 0 будет все выражение

группа 1 будет то, что вам нужно.

Это tutorial может объяснить, как группы работают

Я просто ищу способ, чтобы получить двоичный ответ, похожий на String.matches(), который при нахождении совпадения остановятся происходит через строку

Отнесите: \\A(?:\\s*<?.*?>)?\\s*<lemon>(.*?) без какой-либо группировки

+0

Я не пытаюсь сгруппировать его (или получить то, что соответствует), я просто искал способ, чтобы получить двоичный ответ, похожий на String.matches(), который при находящем матч-сто p, проходящей через строку. если я добавляю a. * (и [\\ s \\ S] *), то он проходит через всю строку и проходит. Я хочу избежать этого и просто получить проход второй, регулярное выражение совпадает с началом ввода. –

+0

Я вижу, см. Мой отредактированный ответ, затем – Tala

+0

Спасибо за ответ; к сожалению, отредактированный ответ не работает, и он проходит через ВСЕ строку ([\\ s \\ S] * является req для работы, но все же чрезвычайно медленным, что было моей начальной проблемой) –