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 № 1w
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.