Разбиение строки на массив слов с помощью регулярных выражений - PullRequest
6 голосов
/ 23 августа 2010

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

var re = /[a-z]+[$\s+]/gi;
var test = "test   one two     three   four ";
var results = test.match(re);

Результаты, которые я ожидаю получить:

[0]: "test   "
[1]: "one "
[2]: "two     "
[3]: "three   "
[4]: "four "

Однако после каждого слова он соответствует только одному пробелу:

[0]: "test "
[1]: "one "
[2]: "two "
[3]: "three "
[4]: "four "

Что я делаю не так?

Ответы [ 5 ]

9 голосов
/ 23 августа 2010

Рассмотрим:

var results = test.match(/\S+\s*/g);

Это гарантировало бы, что вы не пропустите ни одного символа (кроме нескольких пробелов в начале, но \S*\s* может позаботиться об этом)

Ваше оригинальное регулярное выражение гласит:

  • [a-z]+ - соответствует любому количеству букв (хотя бы одной)
  • [$\s+] - многозначный символ - $, + или пробел. Если после этой группы нет квантификатора, вы соответствуете только одному пробелу.
2 голосов
/ 23 августа 2010

Попробуйте следующее:

test.match(/\w+\s+/g); // \w = words, \s = white spaces
1 голос
/ 23 августа 2010

Вы используете + внутри класса char. Попробуйте вместо этого использовать * вне класса char.

/[a-z]+\s*/gi;

+ внутри класса char обрабатывается как литерал +, а не как мета-символ. Использование * захватит ноль или более пробелов, которые могут следовать за любым словом.

0 голосов
/ 23 августа 2010

Важным битом вашего RegEx, который требует изменения, является часть, соответствующая пробелу или концу строки.

Попытка:

var re = /[a-z]+($|\s+)/gi

или, для групп без захвата (не знаю, нужно ли вам это с флагом /g):

var re = /[a-z]+(?:$|\s+)/gi
0 голосов
/ 23 августа 2010

+ воспринимается буквально внутри класса персонажа. Вы должны переместить его наружу: [\s]+ или просто \s+ ($ также не имеет значения внутри класса).

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