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"

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.

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.