2016-07-06 5 views
1

мне нужно найти все вхождения «ул» в любом объявлении класса на любой HTML страницы, как это, например:Regular Expression, чтобы найти все вхождения слова в lookaround выражение

class="st0 st1 st2", class="st3 st45", class="st678" 

я говорю в пределах потому что в документе могут присутствовать другие «st», и я не хочу менять каждое событие.

Моя конечная цель - найти и заменить. У меня есть логика, написанная для этого, но мне просто нужно выяснить, как изолировать «st» от строки.

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

Это выражение получает все от 'класса = "' и '"':

Регулярное выражение:

(?<=class=").*(?=") 

Тест жала: результат

class="st10 st11" 

Matching:

"st10 st11" 

Вот еще один я попробовал:

Регулярное выражение:

(?<=class=")((st)\d*\s*)*(?=") 

Тест жала: результат

class="st10 st11" 

Matching:

"st10 st11" 

Соответствующие группы:

  1. ST11
  2. ул

Я проверял мое регулярное выражение здесь Rubular.com

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

perl -pi -w -e 's/st/stx/g;' ~/Desktop/svg_find_replace/*.svg. 

Любая помощь будет оценена.

+1

Это может быть сделано гораздо проще с помощью синтаксического анализатора - если это не вариант [** '\ bst \ d +' **] (https://regex101.com/r/aJ8cU8/1), может быть, что ты ищешь. – Jan

+0

Точно, посмотрите на это: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

Я собираюсь использовать регулярное выражение в пределах которую я буду запускать в определенной папке. Команда оболочки выполнит поиск и замену на каждый файл, находящийся в папке, такой как ... perl -pi -w -e 's/st/stx/g;' ~/Desktop/svg_find_replace/*. SVG. – masahs

ответ

0

Вы можете использовать регулярное выражение, основанное на \G to chain matches.

(?:class="|\G(?!^))(?:(?!st)[^"])*\Kst 
  • (?: открывает non capturing group для чередования.
  • (?:class="|\G(?!^)) Первая часть - установить, где начинается матч. \G также будет соответствовать началу строки. Для предотвращения этого используется отрицательный lookahead(?!^).
  • (?:(?!st)[^"])* эта часть должна соответствовать любому количеству символов, которые not" и предотвратить пропуск st путем использования отрицательного предпросмотра (?!st)
  • \K resets начала отчетного матча.

Here is the demo at regex101. Это, вероятно, довольно продвинутый шаблон. SO имеет хороший regex faq.