Как найти, какой разделитель использовался при разбиении строки (VB.NET) - PullRequest
3 голосов
/ 26 апреля 2010

Допустим, у меня есть строка, которую я хочу разделить на несколько символов, таких как ".", "!" и "?". Как определить, какой из этих символов разделил мою строку, чтобы я мог добавить этот же символ обратно в конец рассматриваемых разделенных сегментов?

    Dim linePunctuation as Integer = 0
    Dim myString As String = "some text. with punctuation! in it?"

    For i = 1 To Len(myString)
        If Mid$(entireFile, i, 1) = "." Then linePunctuation += 1
    Next

    For i = 1 To Len(myString)
        If Mid$(entireFile, i, 1) = "!" Then linePunctuation += 1
    Next

    For i = 1 To Len(myString)
        If Mid$(entireFile, i, 1) = "?" Then linePunctuation += 1
    Next

    Dim delimiters(3) As Char
    delimiters(0) = "."
    delimiters(1) = "!"
    delimiters(2) = "?"

    currentLineSplit = myString.Split(delimiters)

    Dim sentenceArray(linePunctuation) As String
    Dim count As Integer = 0

    While linePunctuation > 0

        sentenceArray(count) = currentLineSplit(count)'Here I want to add what ever delimiter was used to make the split back onto the string before it is stored in the array.'

        count += 1
        linePunctuation -= 1

    End While

Ответы [ 4 ]

3 голосов
/ 26 апреля 2010

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

SplitArray = Regex.Split(myString, "([.?!])")

Тогда возвращаемый массив содержит как текст между пунктуацией, так и отдельные элементы для каждого символа пунктуации. Функция Split() в .NET включает текст, сопоставленный с захватом групп в возвращаемом массиве. Если ваше регулярное выражение имеет несколько групп захвата, все их совпадения включаются в массив.

Это разбивает ваш образец на:

some text
.
 with punctuation
!
 in it
?

Затем вы можете перебрать массив, чтобы получить ваши "предложения" и пунктуацию.

0 голосов
/ 26 апреля 2010

Как только вы позвонили Split со всеми 3 символами, вы отбросили эту информацию.Вы можете сделать то, что вы пытаетесь сделать, разделив себя или разделив один знак препинания за раз.

0 голосов
/ 26 апреля 2010

Вы можете использовать LINQ

см. ссылку для хорошего примера

0 голосов
/ 26 апреля 2010

.Split () не предоставляет эту информацию.

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

Самая простая реализация выглядела бы так:

var input = "some text. with punctuation! in it?";
string[] sentences = Regex.Split(input, @"\b(?<sentence>.*?[\.!?](?:\s|$))");
foreach (string sentence in sentences)
{
    Console.WriteLine(sentence);
}

Результаты

some text.
with punctuation!
in it?

Но вы очень скоро обнаружите, что язык, на котором говорят / пишут люди, в большинстве случаев не следует простым правилам.

Вот в VB для тебя:

Dim sentences As String() = Regex.Split(line, "\b(?<sentence>.*?[\.!?](?:\s|$))")

Удачи.

...