Возможно, вы найдете это в Google, пытаясь написать регулярное выражение, способное сопоставлять сегменты строки (в отличие от целых строк), которые не содержат подстроку. Уделите мне немного времени, чтобы разобраться, и я поделюсь:
С учетом строки:
<span class="good">bar</span><span class="bad">foo</span><span class="ugly">baz</span>
Я хочу сопоставить <span>
теги, которые не содержат подстроку «bad».
/<span(?:(?!bad).)*?>
будет соответствовать <span class=\"good\">
и <span class=\"ugly\">
.
Обратите внимание, что есть два набора (слоя) скобок:
- Самый внутренний - для негативного взгляда (это не группа захвата)
- Самое внешнее было интерпретировано Ruby как группа захвата, но мы не хотим, чтобы это была группа захвата, поэтому я добавил?: В начале, и он больше не интерпретируется как группа захвата.
Демонстрация в Ruby:
s = '<span class="good">bar</span><span class="bad">foo</span><span class="ugly">baz</span>'
s.scan(/<span(?:(?!bad).)*?>/)
# => ["<span class=\"good\">", "<span class=\"ugly\">"]