Разбейте строку на несколько слов и проследите, какое слово где - PullRequest
1 голос
/ 15 декабря 2010

Я пытаюсь разбить длинную строку на основе массива слов. Например:

Слова: пытаясь, долго, массив

Предложение: "Я пытаюсь разбить длинную строку на основе массива слов."

Результирующий строковый массив:

  • Я
  • попытка
  • чтобы разделить
  • длинный
  • строка на основе
  • массив
  • слов

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

Есть ли простой способ сделать это в .NET?

Ответы [ 6 ]

2 голосов
/ 15 декабря 2010

Самый простой способ сохранить разделители в результате - использовать метод 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* не является обязательным для моего предыдущего упоминания об обрезке.

1 голос
/ 15 декабря 2010

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

(.*?)((?:trying)|(?:long)|(?:array))(.*)

даст вам три группы, если оно соответствует:

  • 1) Бит перед первым экземпляром любого из разбиенияслова.
  • 2) Само разделенное слово.
  • 3) Остальная часть строки.

Можно продолжать сопоставлять (3), пока не закончитсясовпадений.

Я поиграл с этим, но я не могу получить ни одного регулярного выражения, которое разделит на все экземпляры целевых слов.Может быть, кто-то с большим количеством регулярных выражений может объяснить, как.

Я предположил, что VB имеет поддержку регулярных выражений.Если нет, я бы порекомендовал использовать другой язык.Конечно, в C # есть регулярные выражения.

0 голосов
/ 20 января 2013

Питер, я надеюсь, что приведенное ниже подойдет для разделения строки по массиву слов с использованием Regex

// Input
String input = "insert into tbl1 inserttbl2 insert into tbl2 update into tbl3 
updatededle into tbl4 update into tbl5";

//Regex Exp
String[] arrResult = Regex.Split(input, @"\s+(?=(?:insert|update|delete)\s+)",
RegexOptions.IgnoreCase);

//Output
[0]: "insert into tbl1 inserttbl2"
[1]: "insert into tbl2"
[2]: "update into tbl3 updatededle into tbl4"
[3]: "update into tbl5" 
0 голосов
/ 15 декабря 2010

как то так

    Dim testS As String = "I am trying to split a long string based on a long array of words."

    Dim splitON() As String = New String() {"long", "trying", "array"}

    Dim result As New List(Of String)
    result.Add(testS)

    For Each spltr As String In splitON
        Dim NewResult As New List(Of String)
        For Each s As String In result
            Dim a() As String = Strings.Split(s, spltr)
            If a.Length <> 0 Then
                For z As Integer = 0 To a.Length - 1
                    If a(z).Trim <> "" Then NewResult.Add(a(z).Trim)
                    NewResult.Add(spltr)
                Next
                NewResult.RemoveAt(NewResult.Count - 1)
            End If
        Next
        result = New List(Of String)
        result.AddRange(NewResult)
    Next
0 голосов
/ 15 декабря 2010
    Dim testS As String = "I am trying to split a long string based on an array of words."

    Dim splitON() As String = New String() {"trying", "long", "array"}

    Dim newA() As String = testS.Split(splitON, StringSplitOptions.RemoveEmptyEntries)
0 голосов
/ 15 декабря 2010

Вы можете разделить с помощью "", а затем просмотреть слова и посмотреть, какое из них содержится в массиве "разделение слов"

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