Самый простой способ сохранить разделители в результате - использовать метод Regex.Split
и построить шаблон, используя чередование в группе . Группа является ключом к включению разделителей как части результата, иначе она их отбросит. Шаблон будет выглядеть как (word1|word2|wordN)
, а круглые скобки предназначены для группировки. Кроме того, вы всегда должны экранировать каждое слово, используя Regex.Escape
метод , чтобы избежать их неправильного толкования как метасимволов регулярных выражений.
Я также рекомендую прочитать мой ответ (и ответы других) на аналогичный вопрос для получения дополнительной информации: Как разделить строку на строки и включить разделители, используя .NET?
Поскольку я ответил на этот вопрос в C #, вот версия VB.NET:
Dim input As String = "I am trying to split a long string based on an array of words."
Dim words As String() = { "trying", "long", "array" }
If (words.Length > 0)
Dim pattern As String = "(" + String.Join("|", words.Select(Function(s) Regex.Escape(s)).ToArray()) + ")"
Dim result As String() = Regex.Split(input, pattern)
For Each s As String in result
Console.WriteLine(s)
Next
Else
' nothing to split '
Console.WriteLine(input)
End If
Если вам нужно обрезать пробелы вокруг каждого разделяемого слова, вы можете добавить префикс и суффикс \s*
к шаблону, чтобы он соответствовал окружающим пробелам:
Dim pattern As String = "\s*(" + String.Join("|", words.Select(Function(s) Regex.Escape(s)).ToArray()) + ")\s*"
Если вы используете .NET 4.0, вы можете отбросить вызов ToArray()
внутри метода String.Join
.
РЕДАКТИРОВАТЬ: Кстати, вам нужно заранее решить, как вы хотите, чтобы раскол работал. Должно ли оно соответствовать отдельным словам или словам, которые являются подстрокой других слов? Например, если ваш ввод содержит слово «принадлежат» , вышеприведенное решение разделится на «long», что приведет к {"be", "long"}
. Это желательно? Если нет, то незначительное изменение в шаблоне обеспечит совпадение слов с полными словами. Это достигается путем окружения шаблона метасимволом \b
:
Dim pattern As String = "\s*\b(" + String.Join("|", words.Select(Function(s) Regex.Escape(s)).ToArray()) + ")\b\s*"
\s*
не является обязательным для моего предыдущего упоминания об обрезке.