Что нового

[RegExp] Использование Non-capturing group

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Гуру, помогите разобраться, при захвате строки, нужно получить 1 элемент массива, без <asd>.
По справке вроде должно выполняться через (?: ... ), но что не работает.

Код:
; <td>aaa <asd>bbb</td> ; Нужно получить aaa bbb
; <td>aaa<asd>bbb</td>
; <td>aaa <asd></td>
$ret=StringRegExp(ClipGet(),'(?s)<td>(.*(?:<asd>).*)</td>',3)
_ArrayDisplay($ret)
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
r35p3ct сказал(а):
По справке вроде должно выполняться через (?: ... ), но что не работает.
Выдаётся всё содержимое группы.
Non-capturing group может пригодится, если на пример какаято строка может несколько раз повторяться.

У меня получился такой вот полубред, имхо проще StringReplace изпользовать.

Код:
#include <Array.au3>

$sString = '; <td>aaa <asd>bbb</td> ; Нужно получить aaa bbb' & @CRLF & _
		   '; <td>ccc<asd>ddd</td>' & @CRLF & _
		   '; <td>fff <asd></td>'
$ret=StringRegExp(StringRegExpReplace($sString,'(?s)<td>(.*?)<asd>(.*?)</td>', '<tdasd>$1$2</tdasd>'), '(?s)<tdasd>(.*?)</tdasd>', 3)
_ArrayDisplay($ret)
 
Автор
R

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Это все понятно, проще тогда так:
Код:
$ret=StringRegExp(ClipGet(),'(?s)<td>(.+)(?:<asd>)(.*?)</td>',3)

Вопрос именно в том, возможно ли получить в одну переменную и без лишних манипуляций.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
r35p3ct [?]
По справке вроде должно выполняться через (?: ... ), но что не работает
Всё работает. Эта “не захвачиваемая” группа попадает в захвачиваемую, поэтому эффекта никакого. Нужно делать так, раз уж попутные символы (которые не нужно захвачивать) известны:

Код:
$ret = StringRegExpReplace(ClipGet(), '(?s).*?<td>(.*?)<asd>(.*?)</td>.*?', '\1\2' & @LF)
ConsoleWrite($ret & @LF)


Но это конечно не решает проблемы, я понял что требуется, но мне кажется такой захват не поддерживается, так просто “перескочить” через символы в захватывающей группе не получится. Буду рад ошибаться.
 
Верх