/ / Por que ter um espaço literal entre tokens regex leva a diferentes objetos matchdata? - rubi, regex

Por que ter um espaço literal entre tokens regex leva a diferentes objetos matchdata? - rubi, regex

Por exemplo, considere as seguintes expressões:

no_space = "This is a test".match(/(w+)(w+)/)
with_space = "This is a test".match(/(w+) (w+)/)

A expressão no_space agora é o objeto matchdata #<MatchData "This" 1:"Thi" 2:"s">, enquanto with_space é #<MatchData "This is" 1:"This" 2:"is">. O que está acontecendo aqui? Parece-me que o espaço literal entre tokens indica ao ruby ​​que ele deve corresponder a várias palavras, se possível, enquanto não ter um espaço faz com que a partida seja limitada a uma palavra. Qualquer explicação ou esclarecimento sobre o assunto seria apreciado.

Obrigado.

Respostas:

1 para resposta № 1

w não combina espaço e + é ganancioso a menos que você siga por ?, então Ruby tenta combinar tantas w quanto possível, contanto que o resto do expresso também corresponda, consumindo efetivamente Thi na primeira captura e s no segundo.

Quando você adiciona um espaço, o Ruby corresponde a w até um caractere de espaço e, em seguida, quantas w, portanto, correspondendo This e is.

Por favor, deixe-me saber se isso não está claro.


0 para resposta № 2

Com a expressão regular /(w+)(w+)/, os únicos personagens que podem ser correspondidos sãocaracteres de palavras (letras, dígitos e sublinhados). Uma expressão regular sempre corresponderá a caracteres consecutivos em uma sequência, portanto, a menos que você inclua algo na expressão regular para corresponder aos espaços entre as palavras, a expressão regular não poderá corresponder a mais de uma palavra.