2015-06-11 2 views
0

У меня есть ниже код в моем приложении:Регулярное выражение^\ Q & \ E

private String getRequestPath(HttpServletRequest req) { 
     String path = req.getRequestURI(); 
     path = path.replaceFirst("^\\Q" + req.getContextPath() + "\\E", ""); 
     path = URLDecoder.decode(path); 
     System.out.println("req.getRequestURI()="+req.getRequestURI()); 
     System.out.println("path="+path); 
     return path; 
    } 

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

req.getRequestURI()=/MyApp/test 
path=/test 

Как ^\\Q & \\E работает в регулярных выражениях.

+0

Вы все равно не должны их использовать. Вместо этого используйте 'Pattern.quote' - это безопаснее – nhahtdh

ответ

2

\Q и \E - соответственно начало и конец строки в литерале регулярного выражения; они инструктируют движок регулярных выражений не интерпретировать текст между этими двумя «маркерами» как регулярные выражения.

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

\Q**\E 

Это будет соответствовать два буквенным звездам, а не пытаться интерпретировать их как «ноль или более» квантор ,

Другой, более портативное решение делать это вместо того, чтобы писать это вручную, как в вашем коде будет использовать Pattern.quote:

path = path.replaceFirst(Pattern.quote(req.getContextPath()), ""); 
1

В \Q и \E разделители для цитирования литералов.

От documentation:

\Q

Ничего, но не цитирует все символы до \ E

\E

Ничего, но заканчивается квотирование запускается \ Q

0

В регулярном выражении, все символы между \ Q и \ E экранируются

Так .. если у вас есть строка, чтобы соответствовать и если он содержит специальные символы регулярных выражений ставят строка внутри \Q и \E, чтобы соответствовать им буквально.

Смежные вопросы