Почему 'abc'.split (/ (a | b | c) /) дает пустые строки a, b, c и AND в Javascript? - PullRequest
2 голосов
/ 21 февраля 2012

Я пытаюсь написать функцию для разбиения слова на буквы, и получаю странный результат:

'abc'.split(/(a|b|c)/) 

Дает:

["", "a", "", "b", "", "c", ""]

Кстати, яувидеть те же результаты в Python, так что проблема явно во мне!

>>> re.split( '(a|b|c)', 'abc')
['', 'a', '', 'b', '', 'c', '']

Проблема в том, почему между буквами вставляются пустые строки?Я ожидал

["a", "b", "c"]

Спасибо!

Ответы [ 4 ]

7 голосов
/ 21 февраля 2012

Вместо разделения вы можете сопоставить строки с глобальным регулярным выражением ...

'abc'.match(/(a|b|c)/g); // ["a", "b", "c"]

Это имеет больше смысла, поскольку все, что вас действительно волнует, - это совпадение, а не то, что находится между совпадением.

Если вы хотите сопоставить любой символ от a до z, вы можете сделать это ...

'abc'.match(/([a-z])/gi);

Я сделал регистр нечувствительным, чтобы совпадать и с верхним регистром.

5 голосов
/ 21 февраля 2012

Между разделителями есть пустые строки, потому что вы разделяете на этих букв. a, b и c - это токены «разделителя», а '' - это фактическое «слово», которое находится между вами.

Например, если вы разделите "x,y" на ',', вы ожидаете получить «x», «,» и «y». Если вы разделите ",y" на ',', вы получите "", "," и "y". Поэтому, если вы разделите "ay" на 'a', вы получите «», «a» и «y».

1 голос
/ 21 февраля 2012

См. эту страницу :

Если разделитель является регулярным выражением, содержащим скобки захвата, то каждый раз, когда разделитель сопоставляется, результаты (включая любые неопределенные результаты) скобок захвата вставляются в выходной массив. Однако не все браузеры поддерживают эту возможность.

Если вы удалите скобки, вы получите ожидаемый результат:

> 'abc'.split(/a|b|c/)
["", "", "", ""]

То есть вы разбиваете свою строку везде, где есть "a", "b" или "c", оставляя только пробелы между ними.

Но, похоже, это не то, что вы хотите. Если вы хотите получить результат ["a", "b", "c"], используйте "match", как это было предложено ниже.

0 голосов
/ 21 февраля 2012

Другие ответы охватили угол регулярного выражения, но

Я пытаюсь написать функцию для разбиения слова на буквы

Для достижения поставленной цели вам вообще не нужно регулярное выражение.Просто передайте пустую строку в .split():

'abc'.split('')

Результат будет:

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