Dado o seguinte padrão:
group1: hello, group2: world
group1: hello (hello, world) world, group2: world
group1: hello world
do estilo <group_name>: <group_value>[, <group_name>: <group_value>[...]]
.
Em geral eu uso o seguinte regex para extrair os valores:
group1:\s(?P<group1>[^,\n]+)(:?,\sgroup2:\s(?P<group2>[^,\n]+))?\n
que funciona arquivo, a menos que ,
exista dentro do arquivo group_value
.
Eu sei que este exemplo de brinquedo pode ser resolvido por algo como:
group1:\s(?P<group1>.+?)(?:,\sgroup2:\s(?P<group2>.+?))?\n
No entanto, quero me proteger contra combinar tudo acidentalmente, então ainda gostaria de limitar minha correspondência quando encontrar um arquivo ,
.
Pergunta : Existe uma maneira (geral) de corresponder ,
e, para esse fim, ignorar ,
s que estão entre colchetes?
Usando pcre, você pode usar um padrão recursivo para parênteses balanceados com quantificadores possessivos .
você define o padrão para o grupo 1 e, se a mesma lógica se aplica ao grupo 2, você pode recursar o subpadrão definido no grupo 1.
Ao excluir a correspondência de uma nova linha na classe de caracteres negados, você pode usar
\h
para corresponder a caracteres de espaço em branco horizontais em vez de usar\s
\bgroup1:\h+
Corresponda à palavra group1 e então:
e 1+ caracteres de espaço em branco horizontal(?P<group1>
Grupo nomeado1(?:
Grupo sem captura[^,\n()]*
Corresponde a caracteres opcionais diferentes de,
nova linha(
ou)
(?:
Grupo sem captura(\((?:[^()\n]+|(?2))*+\))
Corresponde ao grupo recursivo de parênteses balanceados 2)?
Fechar grupo e torná-lo opcional)*+
Feche o grupo e, opcionalmente, repita com um quantificador possessivo (sem retrocesso))
Fechar grupo1(?:
Grupo sem captura,\h+group2:\h+
Match group2: entre caracteres de espaço em branco horizontais(?P<group2>\g<group1>)
Nomeado group2 , recurse o subpadrão no nomeado group1)?
Feche o grupo de não captura e torne-o opcional\R
Corresponder a uma nova linhaDemonstração Regex