2015-11-12 2 views
6

У меня есть следующее регулярное выражение:Исключить последний символ матча регулярного выражения

%(?:\\.|[^%\\ ])*%([,;\\\s]) 

Это прекрасно работает, но, очевидно, это также выдвигает на первый план следующего символа до последнего %.

Мне было интересно, как я могу исключить его из регулярного выражения?

Например, если у меня есть:

The files under users\%username%\desktop\ are: 

Это подчеркнет %username%\, но я просто хочу %username%. С другой стороны, если я оставлю регулярное выражение как это:

%(?:\\.|[^%\\ ])*% 

... тогда он будет соответствовать этому шаблону, что я не хочу:

%example1%example2%example3 

Любая идея, как исключить последний символ в матче через регулярное выражение?

+0

Я думаю, что нашел решение с новым RegEx ... извините за публикацию этого слишком рано! Это делает то, что мне нужно ... '% (?: \\.| [^ "% \ d \\]) *%' – user3587624

+0

Это регулярное выражение неэффективно, так как у вас есть группа чередования с применяемым квантификатором. Если это не проблема (строки у вас короткие), это нормально. Если они могут быть немного длиннее, вам нужно развернуть его. См. [Это демо] (https://regex101.com/r/aM2cY3/1) - 6 шагов против 30. –

ответ

3
%(?:\\.|[^%\\ ])*%(?=[,;\\\s]) 

        ^^ 

Используйте lookahead .Что вам нужно здесь 0 width assertion, который ничего не захватывает.

1

Вы можете использовать более эффективное регулярное выражение, чем в настоящее время используете. Когда чередование используется вместе с квантификатором, возникает ненужное обратное отслеживание.

Если строки у вас короткие, это нормально использовать. Однако, если они могут быть немного длиннее, вам может понадобиться «развернуть» выражение.

Вот как это делается:

%[^"\\%]*(?:\\.[^"\\%]*)*% 

Regex пробоя:

  • % - начальный знак процента
  • [^"\\%]* - начало развернутого рисунка: 0 или больше символов, другой, чем двойная кавычка, обратная косая черта и знак процента
  • (?:\\.[^"\\%]*)* - 0 или более последовательностей ...
    • \\. - буквальный символ обратной косой черты следует любой символ, кроме символа новой строки
    • [^"\\%]* - 0 или больше символов, кроме двойные кавычки, обратный слэш и процент знак
  • % - трейлинг знак процента

См. this demo - 6 шагов против 30 шагов с %(?:\\.|[^" %\d\\])*%.

+0

Пожалуйста, проверьте мой ответ, я надеюсь, что это поможет вам больше понять regex. Подробнее о том, как [развернуть цикл в regex можно найти здесь] (http://www.softec.lu/site/RegularExpressions/UnrollingTheLoop). –

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