Не удается получить регулярное выражение 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
Вы смотрите за концом строки $
Ссылка: