Не удается получить регулярное выражение отрицательного просмотра вперед для правильного соответствия

Я пытаюсь сопоставить строки, которые не имеют расширений .jsp / .jspx в Java, и у меня много трудностей с шаблоном отрицательного просмотра вперед.

Учитывая кучу строк:

String string1 = "templateName";
String string2 = "some/path"
String string3 = "basic/filename/no/extension"
String string4 = "some/path/to/file.jsp"
String string5 = "alternative/path/to/file.jspx"

Я пытаюсь найти регулярное выражение, которое соответствует первым 3, а не последним 2.

Я бы подумал, что регулярное выражение с отрицательным взглядом вперед будет работать.

Ex:

Pattern p = new Pattern.compile( "(.+)(?!\\.jsp[x]?)")

Но этот шаблон, похоже, соответствует всем приведенным выше строкам. Сначала я подумал, что группа 1 может быть слишком жадной, поэтому попробовал (. +?), Но это тоже не помогает.

В этом сообщении SO очень хорошо объясняется отрицательный прогноз, но он, к сожалению, не помогает мне найти правильную комбинацию. .

Я упускаю что-то очевидное?


person Eric B.    schedule 28.10.2013    source источник
comment
В вашем шаблоне говорится: «Если вы можете найти любую непустую последовательность символов, за которой сразу не следует .jsp или .jspx, то это совпадение. Поэтому, конечно, он будет соответствовать some/path/to/file.jsp, потому что он может соответствовать s, so или чему-то еще, если он не включает последнюю косую черту. См. Ответы анубхавы. Во втором случае используется отрицательный просмотр вперед для сбоя, если за началом строки следует непустая последовательность символов, за которой следует .jsp[x] (если .jsp[x] находится в конце строки).   -  person ajb    schedule 28.10.2013


Ответы (2)


Вы можете использовать negative lookbehind как:

Pattern p = new Pattern.compile( "^(.+)(?<!\\.jspx?)$" );

ИЛИ вы можете использовать negative lookahead как:

Pattern p = new Pattern.compile( "^(?!.+?\\.jspx?$)(.+)$" );
person anubhava    schedule 28.10.2013
comment
Спасибо за ответ. К сожалению, я не понимаю, как работает любой из этих шаблонов. Можете ли вы дать небольшое объяснение того, как совпадают эти шаблоны? Мне никогда не удавалось должным образом уловить конструкцию экзорессий lookahead или lookbehind. - person Eric B.; 28.10.2013
comment
@EricB .: Для лучшего объяснения поиска посетите этот простой документ: regular-expressions.info/lookaround .html - person anubhava; 28.10.2013
comment
Как только вы будете удовлетворены моим ответом, подумайте о том, чтобы пометить его как принятый, чтобы пользователи, столкнувшиеся с аналогичной проблемой в будущем, могли легко ее увидеть. - person anubhava; 29.10.2013

Вот еще один негативный взгляд назад:

Pattern p = new Pattern.compile(".*(?<!.jspx?)$");

(?<!.jspx?) - это утверждение с отрицанием просмотра назад, что означает, что до конца строки нет .jsp или .jspx

Вы смотрите за конец строки $

Ссылка:

http://www.regular-expressions.info/lookaround.html

Регулярное выражение не заканчивается на

person Indu Devanath    schedule 29.10.2013