Почему использование регулярных выражений и .scan приводит к таким результатам? - PullRequest
0 голосов
/ 26 сентября 2011
>> "aaaaaafbfbfsjjseew".scan(/(.)/)
=> [["a"], ["a"], ["a"], ["a"], ["a"], ["a"], ["f"], ["b"], ["f"], ["b"], ["f"], ["s"], ["j"], ["j"], ["s"], ["e"], ["e"], ["w"]]


>> "aaaaaafbfbfsjjseew".scan(/((.))/)
=> [["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["f", "f"], ["b", "b"], ["f", "f"], ["b", "b"], ["f", "f"], ["s", "s"], ["j", "j"], ["j", "j"], ["s", "s"], ["e", "e"], ["e", "e"], ["w", "w"]]

>> "aaaaaafbfbfsjjseew".scan(/((.)\2*)/)
=> [["aaaaaa", "a"], ["f", "f"], ["b", "b"], ["f", "f"], ["b", "b"], ["f", "f"], ["s", "s"], ["jj", "j"], ["s", "s"], ["ee", "e"], ["w", "w"]]


>> "aaaaaafbfbfsjjseew".scan(/((.)\1*)/)
=> [["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["f", "f"], ["b", "b"], ["f", "f"], ["b", "b"], ["f", "f"], ["s", "s"], ["j", "j"], ["j", "j"], ["s", "s"], ["e", "e"], ["e", "e"], ["w", "w"]]

>> "aaaaaafbfbfsjjseew".scan(/((.)\3*)/)
=> [["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["f", "f"], ["b", "b"], ["f", "f"], ["b", "b"], ["f", "f"], ["s", "s"], ["j", "j"], ["j", "j"], ["s", "s"], ["e", "e"], ["e", "e"], ["w", "w"]]

Ответы [ 2 ]

8 голосов
/ 26 сентября 2011

Из тонкой инструкции :

str.scan (шаблон) → массив
[...]
Если шаблон содержит группы, каждый отдельный результат сам является массивом, содержащим одну запись на группу.

Вот этот:

"aaaaaafbfbfsjjseew".scan(/(.)/)

имеет группу, поэтому вы получаете массив массивов: каждый отдельный результат представляет собой массив из одного элемента.

Следующий:

"aaaaaafbfbfsjjseew".scan(/((.))/)

имеет две группы, которые имеют одно и то же значение, поэтому вы получаете два идентичных элемента в ваших отдельных результатах массивах.

Третий:

"aaaaaafbfbfsjjseew".scan(/((.)\2*)/)

снова содержит две группы, но также содержит обратную ссылку на внутреннюю группу, так что внешняя группа (AKA первая группа) поглощает дубликаты, и вы получаете ["aaaaaa", "a"], ["jj", "j"] и ["ee", "e"].

Четвертый:

"aaaaaafbfbfsjjseew".scan(/((.)\1*)/)

просто пытается переключить обратную ссылку на внешнюю группу, но \1 не определено внутри группы 1, поэтому эквивалентно /((.))/.

Пятый:

"aaaaaafbfbfsjjseew".scan(/((.)\3*)/)

пытается сослаться на несуществующую группу (группу 3, когда есть только две группы), поэтому она ведет себя так же, как /((.))/.

0 голосов
/ 26 сентября 2011

"aaaaaafbfbfsjjseew".scan(/(.)/) означает, что строку можно разбить на отдельный массив строк.

Здесь в скобках указано, что это массив, а символ . в скобках представляет количество символов в этой отдельной строкемассив.

Если мы напишем для предположения "hellovenkat".scan(/(...)/), это приведет к [["hel"],["lov"],["enk"]].Он не дает последний индекс, потому что он не может содержать три символа.

Если мы дадим "hello venkat".scan(/(...)/), это приведет к следующему.Ответ: [["hel"], ["lo "], ["ven"], ["kat"]].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...