如何在字符串分割(VB.NET)时找到使用的分隔符

4

假设我有一个字符串,我想根据几个字符(例如".""!""?")进行分割。如何确定是哪个字符将字符串拆分,以便我可以将该字符添加回要拆分的段的末尾?

    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

如果你有一个像这样的字符串:askawuea.qwerq23rq!asfasfdakh.woaweifhaf!asdfasfasdf,那么分隔符是什么? - Raj Kaimal
打字错误,为什么不直接说你想把段落分成句子呢?;-) - Sky Sanders
3个回答

3
如果您在正则表达式中添加一个捕获组,像这样:
SplitArray = Regex.Split(myString, "([.?!])")

那么返回的数组包含标点符号之间的文本以及每个标点符号的单独元素。在.NET中,Split()函数会将捕获组匹配的文本包含在返回的数组中。如果您的正则表达式有多个捕获组,则它们所有的匹配都将包含在数组中。

这将把您的示例拆分为:

some text
.
 with punctuation
!
 in it
?

你可以遍历数组来获取你的“句子”和标点符号。

我无法让它工作(也无法让其他答案起作用),但我会相信你的话,并在有更多时间时再次尝试。谢谢! - ubiquibacon

0

.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);
}

结果

一些文本。
带标点符号!
在里面?

但你很快会发现,语言,就像人类所说/写的那样,大部分时间都不遵循简单的规则。

这是VB.NET版本:

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

啊,桑德斯先生,我实际上是为了您而做这个 :) (因为有关如何最好地翻译大块文本的问题)。我快完成了,但我无法正确运行此部分。您能详细说明一下我如何使用正则表达式来获取我想要的内容吗? - ubiquibacon
1
@typo - 好的,稍后我会尝试一下。关于翻译这件事,相信我...我已经走过了漫长而艰辛的路程,并且积累了一些经验。通过标记化进行翻译是一个愚蠢的任务。;-) - Sky Sanders
好的,我会把我的代码发到那个其他问题的帖子里。当我使用只有以句点结尾的句子的文件时,它的工作方式与我想象的完全一样,这足以证明我所说的是正确的。我只是试图让它能够处理其他标点符号。也许你可以过来取消对我的回答的踩 :) - ubiquibacon
@typo - 获取你的红热正则表达式。我理解你想做什么,尽管之前似乎你在暗示标记化将在单词边界上完成。在句子上分割可能会给出稍微不那么不连贯的结果。但这是假设你只是在进行英语-->XXXX的转换。尝试解析波斯语“=)”。 - Sky Sanders

-1

一旦您使用所有3个字符调用了Split,您就已经丢弃了那些信息。您可以通过自己拆分或逐个拆分标点符号来完成您想要的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接