2016-11-29 3 views
1

У меня есть текст:Regex чтобы соответствовать, если данный текст не найден и соответствовать как можно меньше

<a> 
sdfsdf 
<b>DDzz</b> 
sdfsdf 
</a> 
<a> 
sdfsdf 
<b>DDzz</b> 
sdfsdf 
</a> 
<a> 
sdfsdf 
<b>BBzz</b> 
sdfsdf 
</a> 
<a> 
sdfsdf 
<b>DDzz</b> 
sdfsdf 
</a> 

Я не могу разобрать его как XML. Мне нужно использовать regex здесь. Также это только пример.

Я хочу регулярное выражение, которое может соответствовать каждой группе <a>...</a>, которая не содержит элемент b с текстом, который начинается с BB.

Я пришел с этим регулярным выражением: <a>.*?<b>(?!B).*?</b>.*?</a> Но матчи последней группы, как:

<a> 
sdfsdf 
<b>BBzz</b> 
sdfsdf 
</a> 
<a> 
sdfsdf 
<b>DDzz</b> 
sdfsdf 
</a> 

Что плохо для меня.

Как написать регулярное выражение, которое будет соответствовать только этим 3 группам из моего приведенного примера?:

1.

<a> 
sdfsdf 
<b>DDzz</b> 
sdfsdf 
</a> 

2.

<a> 
sdfsdf 
<b>DDzz</b> 
sdfsdf 
</a> 

3.

<a> 
sdfsdf 
<b>DDzz</b> 
sdfsdf 
</a> 

ответ

2

Используйте tempered greedy token регулярное выражение:

<a>(?:(?!<(?:b>BB|/?a>)).)*</a> 

Включить . спичек новой строки вариант.

Деталь:

  • <a> - буквальный <a> символа последовательность
  • (?:(?!<(?:b>BB|/?a>)).)* - закаленного жадный маркер соответствия любого символа (.), который не начальный символ последовательности, которые могут быть сопоставлены с рисунок внутри шкалы (?!<(?:b>BB|/?a>)) (не <b>BB или </a> или <a>)
  • </a> - буквальное последовательность </a> голец

enter image description here

+1

Это вас. Это было замечательно. Сегодня я многому научился. – Hooch