RegEx-golf: corresponde a todo o conteúdo em uma string

10

Sua tarefa é escrever um RegEx que corresponda a tudo dentro das strings.

Uma string é definida como tudo cercado por (mas não incluindo) dois sem escape ".

Um "pode ser escapado por \, que também pode ser escapado novamente.

Casos de teste

string:  ab\c"defg\\\"hi"jkl"mn\\\\"opqrst""
matches:      ^^^^^^^^^^     ^^^^^^        ^ (the empty string)

Pontuação

A solução mais curta vence.

Especificações

  • Por favor, especifique o sabor usado.
  • A entrada terá balanceado ".
  • Não haverá nenhum \que preceda imediatamente um delimitador do início da string. Por exemplo, você não precisaria lidar comabc\"def"
Freira Furada
fonte
11
Haverá \antes de uma string? Por exemplo abc\"def".
Jimmy23013
Ele deve corresponder a cada corda em um grupo? Por exemplo, eu poderia escrever algo que tenha duas correspondências abc"de", uma é de a outra é e?
jimmy23013
Isso é permitido .
Freira vazando
Haverá cadeias vazias?
Martin Ender
Sim, haverá strings vazias.
Freira vazando

Respostas:

3

PCRE, 21 20 15 19 bytes

(.|^)"\K(\\.|[^"])*

Experimente aqui.

Isso corresponde a um caractere (ou ao início da entrada) antes da aspas duplas iniciais e, em seguida, redefine a correspondência, para garantir que a aspas duplas não seja compartilhada com outra correspondência.

PCRE, 25 23 bytes

Agradecimentos a Martin Büttner por jogar fora 2 bytes.

(\\.|[^"])*+(?!"(?R)|$)

Experimente aqui.

Explicação

(
    \\.|[^"]     # An escaped character, or a character that isn't a double quote
)*+              # Possessive zero-or-more quantifier, which means backtracking
                 # could not happen after first match is found. That means if \\.
                 # matched, it would never switch to [^"], because it is always a
                 # match if it just stopped after the \\. without backtracking.
(?!"(?R)|$)      # Make sure it is not followed by a double quote and another
                 # match, or the end of the input.

Observe que o quantificador possessivo ( *+) garantiu que a cabeça de impressão negativa sempre iniciasse após uma sequência inteira ou um segmento inteiro de não sequência.

Existem 4 casos:

  • A partida começa em qualquer lugar fora de uma string. \\.nunca corresponderia a aspas duplas de acordo com o esclarecimento. Só poderia terminar um pouco antes da próxima citação dupla que inicia uma sequência ou o final da entrada. Ambos os casos falham na aparência negativa.
  • A partida começa no início de uma sequência. (\\.|[^"])*+corresponderia a uma sequência completa. O próximo caractere deve ser aspas duplas e não pode ser o fim da entrada. Após as aspas duplas, ele fica fora da sequência, portanto não pode haver outra correspondência. Por isso, passa pelo negativo negativo.
  • A partida começa no final de uma sequência. Corresponde a uma sequência vazia da mesma maneira que no caso anterior. Mas isso não importa de acordo com o esclarecimento.
  • A partida começa no meio de uma sequência. Impossível porque as correspondências não se sobrepõem.
jimmy23013
fonte
Funcionaria (\\.|[^"])?
Martin Ender
@ MartinBüttner que corresponde a tudo, exceto "
Bálint
@ Bálint eu quis dizer no lugar de ([^\\"]|\\.), não como a solução completa.
Martin Ender
@ MartinBüttner Oh, ok
Bálint
A sugestão de Martin deve funcionar, pois \\.só falha quando não há caractere depois \(ou caractere de nova linha, mas isso pode ser corrigido com sinalizador), e esse caso é coberto pelo olhar negativo por trás. O quantificador possessivo impede o retorno, portanto, não temos outro caso para examinar.
N
0

JavaScript, 24 bytes

"([^"\\]*(?:\\.[^"\\]*)*)"

Grupo 1 é o conteúdo da sequência.

Quem diabos é isso
fonte
Isso não funciona com aspas escapadas e, portanto, falha em atender às especificações.
ATaco 15/02
Ah sim - desculpe. Que tal isso?
Whothehellisthat
Feche mas nenhum charuto, você não deve ser combinando os exteriores "s
Ataco
Sim, era disso que eu tinha medo. Não há como fazê-lo em JavaScript, suponho?
Whothehellisthat
Você pode capturá-lo em um subgrupo
Ataco
0

JavaScript, 21 15 13 12 bytes

"((\\?.)*?)"

O conteúdo da sequência está no grupo 1.

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
12Me21
fonte