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

Я пытаюсь сопоставить строки, которые не имеют расширений.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.

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

Пример:

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

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

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

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

2 ответа

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

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

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

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

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

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

(?<!.jspx?) является отрицательным утверждением с задним взглядом, что означает, что до конца строки не существует.jsp или.jspx

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

Ссылка:

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

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

Другие вопросы по тегам