Я довольно долго искал, чтобы иметь возможность сопоставлять имена некоторых классов, начиная с указанного шаблона в строке HTML.
Вот регулярное выражение, которое я наконец-то придумал:
/(?<=(<[^>]*class=("|')(\w|\ |\-)*))((?<= |\'|\")(foo-|-foo)[^ "']*)/gmi
Образец, с которым я работал:
<body>
<div style="margin-left:6px;" class="foo-pink blfoo-pin-foo-kue red yellow bar-green -moz-FF foo-pink moz-FF foo-pink" >
<fieldset class="foo customClass foo clFieldsBar bar-try" id="idField foo- bar-dfgdgdfg">
<legend><span>Qu'en pensez-vous ?</span></legend>
< id="idText" class='foo- Comment_text fdgdgdfg -foo-ddede mso-whitespace' name="nameText barName"></textarea> bar-deded foo-green
</fieldset>
class="blue dffsf sdf mso-green foo"
</div>
Вы можете видеть, что следующий RegEx делает то, что я на самом деле хочу здесь:
https://regex101.com/r/6W5AUT/4
Проблема в том, что мне нужно, чтобы регулярное выражение выполнялось в коде Delphi. Однако, когда я делаю это, я получаю следующую ошибку:
утверждение за кадром не фиксированной длины
Который после некоторого быстрого исследования (причины ошибки) привел меня к обнаружению, что я не могу использовать отрицательный взгляд сзади с переменной длиной.
Я пытался преобразовать свой RegEx, используя различные методы (например, \ K для сброса соответствия), и вот что я придумал:
/(<[^>]*class=("|'))(\b(foo)(\w|\-)*)*/gmi
Вы можете увидеть это здесь:
https://regex101.com/r/zeQDrK/2
Как видите, он соответствует только первому имени класса каждого атрибута класса в теге.
Теперь уточним, что мне нужно:
- Сопоставить все вхождения имени класса, которые начинаются с шаблона (это может быть "foo", "-foo" или их комбинация),
- Должно совпадать только с именами классов, которые есть в html-теге (поэтому вы можете видеть class = "blue dffsf sdf mso-green foo" вне тега HTML),
- Он должен поддерживать как class = "ClassName1 ClassName2", так и class = 'ClassName1 ClassName2'
Буду признателен за помощь в решении этой проблемы.
Спасибо за ваше время.