Regex.Split () предложение к словам при сохранении пробела - PullRequest
5 голосов
/ 21 ноября 2011

Я использую Regex.Split(), чтобы взять пользовательский ввод и превратить его в отдельные слова в списке, но в данный момент он удаляет все пробелы, которые они добавляют, я хотел бы, чтобы он оставил пробел.

string[] newInput = Regex.Split(updatedLine, @"\s+");

Ответы [ 2 ]

7 голосов
/ 21 ноября 2011
string text = "This            is some text";
var splits = Regex.Split(text, @"(?=(?<=[^\s])\s+)");

foreach (string item  in splits)
    Console.Write(item);
Console.WriteLine(splits.Count());

Это даст вам 4 сплита, в каждом из которых сохранены все ведущие пробелы.

(?=\s+)

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

(?=(?<=[^\s])\s+)

Это означает разделение от точки, у которой перед собой непустой символ и перед ней пробелы.

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

(?=(?<=^|[^\s])\s+)

Это означает, что перед серией пробелов должен быть непробельный символ ИЛИ начало строки.

0 голосов
/ 21 ноября 2011

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

string updatedLine = "user,input,two words,even three words";
string[] newInput = Regex.Split(updatedLine, @",");

Эта версия регулярного выражения позволяет использовать пробелы после запятых:

string updatedLine = "user, input,   two words,    even three words";
string[] newInput = Regex.Split(updatedLine, @",\s+|,");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...