.NET: Возвращает список строк, содержащий список целых слов, чтобы соответствовать - PullRequest
0 голосов
/ 20 марта 2019

Мне нужно разбить строку на подстроки с помощью набора целых слов.

Ввод: word wo wordword

Вывод (разбит на word):

str1: word

str2: [space]wo wordword

Выход (разделен на wo):

str1: word[space]

str2: wo

str3: [space]wordword

Подпись метода для требуемого метода должна выглядеть следующим образом:

public List<string> GetPhrases(string text, List<string> splitters);

Соображения:

  • только целые слова соответствуют

  • пробелы должны быть сохранены

  • сплиттерысписок содержит только отдельные слова

  • разделитель не содержит пробелов

  • совпадения должны быть без учета регистра

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

В настоящее времяУ меня есть решение без регулярных выражений,но это не так здорово:

var words = Regex.Split(text, @"\s+").Where(s => s != string.Empty).ToList();
var str = "";
var list = new List<string>();

foreach (var word in words)
{
    if (!splitters.Contains(word))
    {
        if(words.IndexOf(word) != words.Count - 1)
            str += word + " ";
        else
            str += word;
    }
    else
    {
        if(!string.IsNullOrWhitespace(str))
           list.Add(str);

        list.Add(word);
        str = "";
    }
}

if(!string.IsNullOrWhitespace(str))
   list.Add(str);

Проблема в том, что я не поддерживаю пробелы, такие как переводы строк, а заменяю их пробелом.

1 Ответ

2 голосов
/ 20 марта 2019

Если ваши слова-разделители представляют собой просто полосы буквенно-цифровых символов или символов подчеркивания, вы можете использовать

var results = Regex.Split(s, $@"\b({string.Join("|", splitters)})\b")
                   .Where(s => !string.IsNullOrEmpty(s))

Здесь шаблон \b(word1|word2)\b будет сопоставлять слова разделителя как целые слова, а Regex.Split будет разбивать строку на совпадающие и несоответствующие фрагменты из-за группы захвата ((...)) вокруг слов разделителя в шаблоне .

.Where(s => !string.IsNullOrEmpty(s)) отфильтровывает пустые строки, которые обычно появляются, когда совпадение происходит в результате последовательного совпадения или в начале / конце строки.

См. Демонстрационную версию regex :

enter image description here

...