2016-08-02 4 views
3

Мне нужно регулярное выражение для выполнения поиска в eclipse для соответствия всем строкам, начинающимся с $ {и заканчивающихся}, но не должно иметь pageContext между ними. Для примераRegex Чтобы соответствовать строке, начинающейся и заканчивающейся символами

$ {requestScope.user}

$ {sessionScope.user}

должны соответствуют

но $ {pageContext.request} не должен

После всех усилий я сделал это регулярное выражение (\ $ {), который соответствует строкам, начиная с $ {, но некоторые из них не соответствуют моим требованиям. Помощь будет оценена.

ответ

2

Вы можете использовать отрицательный предпросмотр, чтобы исключить определенные матчи:

\$\{(?!pageContext\.).*?\} 
    ^^^^^^^^^^^^^^^^ 

(?!pageContext\.) опережение потерпит неудачу всех матчей, где { следует с pageContext.. Кроме того, вы можете использовать [^{}]* вместо .*?.

См детализирует regex demo

Pattern:

  • \$ - буквальный $
  • \{ - буквальный {
  • (?!pageContext\.) - провалить матч, если pageContext. следует за { немедленным LY
  • .*? - любые другие, чем новая строка символы 0+ (или [^{}]* - ноль или более другие, чем { и } символов)
  • \} - буквальный }.

ПРИМЕЧАНИЕ:

Если вам необходимо, чтобы избежать согласования любой ${...} подстроки pageContext.везде внутри него, используйте

\$\{(?![^{}]*pageContext\.)[^{}]*\} 
    ^^^^^^^^^ 

Здесь [^{}]* внутри опережающего просмотра будет искать pageContext. после любых символов 0+, кроме { и }.

+0

Спасибо, много работает, но он выбирает всю строку, что если я просто хочу выбрать $ {и} с указанным выше условием, то не вся строка –

+0

@Mckenzie Это регулярное выражение фактически ничего не соответствует, что означает все, что вы используете, возвращает вам строку, сопоставленную, в зависимости от того, как используется ваше регулярное выражение, добавление захвата может и может ничего не делать, но вы * можете * захватить совпадение, выполнив следующее: '(\ $ \ { (?! pageContext \.). *? \}) ' –

+1

@Mckenzie: Хотя можно сопоставить' $ {'не следует с' pageContext' с '\ $ \ {(?! pageContext \.)', это невозможно использовать механизм регулярных выражений Eclipse для соответствия '}', которому не предшествует '{pageContext.', поскольку он не поддерживает поиск в бесконечной ширине. –

0

Посмотрите вперед или посмотрите позади дорого.Вы должны предпочесть дополнительный матч трюк:

\$\{(?:.*pageContext.*|(.*))\} 

Live Example

Чтобы избежать путаницы, позвольте мне указать, что это будет матч любая строка с «$ {» префикс и «}» суффикс, но если строка, содержащая «pageContext», будет удалена. 1 st. Если запись 1 st не пуста, у вас есть строка, соответствующая вашим критериям.

+0

Его выбор $ {pageContext.request}, но это не так. –

+0

@Mckenzie Как вы можете видеть из живого примера, это * не захватывает * «$ {pageContext.request}», это будет только * захват *, если это это матч. Как вы используете результаты этого регулярного выражения? –

+0

Ну, backtracking дороже, чем любой привязанный вид, похожий на мой. 64 шага (мой) (или 30 с отрицательным символьным классом) против 110 (ваш) на одном и том же контенте. –

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