Что нового

[RegExp] Получение строки между кавычками включая отменённые кавычки

CreatoR

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

Пример:

Код:
MsgBox(64, 'Title', 'My ''test''')


Нужно из этого получить массив:

[0] = Title
[1] = My ''test''
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Можно так сделать

Код:
$1="MsgBox(64, 'Title', 'My ''test''')&, '''test'' My' &, 'M ''test'' y' "
$1=StringRegExpReplace($1, "''([^']*?)''", Chr(1)&'\1'&Chr(1))
; MsgBox(0, 'Сообщение', $1)
$a=StringRegExp($1, "'(.*?)'", 3)
For $i = 0 To UBound($a)-1
	$a[$i]=StringReplace($a[$i], Chr(1), "''")
Next

#include <Array.au3>
_ArrayDisplay($a, 'Array')
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Можно попробовать так :
Код:
#Include <Array.au3>

$str = "MsgBox(64, 'Title', 'My ''test''')&, '''test'' My' &, 'M ''test'' y' "

$aOut = StringRegExp($str, '(''(?:[^'']*(?:'''')*[^'']*)*?'')(?!'')', 3)
_ArrayDisplay($aOut)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AZJIO [?]
Можно так сделать
Я бы хотел избежать циклов, я в принципе циклами до сих пор и делаю.

asdf8 [?]
Можно попробовать так :
Почти.

Есть проблема если кавычка встречается раньше:

Код:
$str = 'MsgBox(64, "Title''s", ''test'')'


Мне нужно получать в массиве все строки внутри кавычек, при чём не важно каких (одинарных или двойных).
 

asdf8

Скриптер
Сообщения
564
Репутация
152
CreatoR [?]
Мне нужно получать в массиве все строки внутри кавычек, при чём не важно каких (одинарных или двойных).

Код:
#Include <Array.au3>

$str = "MsgBox(64, 'Title', 'My ''test''')&, '''test'' My' &, 'M ''test'' y' "
$str &= @CRLF & 'MsgBox(64, "Title''s", ''test'')'

$aOut = StringRegExp($str, '(''(?:[^'']*(?:'''')*[^'']*)*?''(?!'')|"(?:[^"]*(?:"")*[^"]*)*?"(?!"))', 3)
_ArrayDisplay($aOut)


или, еще правильнее :

Код:
$aOut = StringRegExp($str, '(''(?:[^''\r\n]*(?:'''')*[^''\r\n]*)*?''(?!'')|"(?:[^"\r\n]*(?:"")*[^"\r\n]*)*?"(?!"))', 3)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
asdf8 [?]
или, еще правильнее
Браво! :thumbs_up: :beer:


P.S.
Правда многострочность не нужна, я всё равно построчно перебираю файл, мне нужно получать номер строки и её оригинал.
 
Верх