Regex net正则表达式返回到省略号或三个句号前的最后一句

Regex net正则表达式返回到省略号或三个句号前的最后一句,regex,vb.net,Regex,Vb.net,我正在尝试编写一个表达式,将一块文本返回到省略号前的一个句号或三个句号(..或..)。因此,我们的想法是,示例文本测试字符串: Lorem ipsum door sit amet,一位杰出的领导者。这是一只猫,它的前庭是一只猫,它的前庭是一只猫。Nam Dignessim laoreet iaculis。Etiam sit amet rhoncus sem。杜伊斯·劳里特·胡斯托·泰卢斯,在帕特·里索斯·莫莱斯蒂大学。Etiam posuere,faucibus hendrerit的生命之角,O

我正在尝试编写一个表达式,将一块文本返回到省略号前的一个句号或三个句号(
..
..
)。因此,我们的想法是,示例文本测试字符串:

Lorem ipsum door sit amet,一位杰出的领导者。这是一只猫,它的前庭是一只猫,它的前庭是一只猫。Nam Dignessim laoreet iaculis。Etiam sit amet rhoncus sem。杜伊斯·劳里特·胡斯托·泰卢斯,在帕特·里索斯·莫莱斯蒂大学。Etiam posuere,faucibus hendrerit的生命之角,Orem Elite consequat urna,mauris的爱神猫。Donec非发酵益生菌。库拉比图尔nec…

将成为:

Lorem ipsum door sit amet,一位杰出的领导者。这是一只猫,它的前庭是一只猫,它的前庭是一只猫。Nam Dignessim laoreet iaculis。Etiam sit amet rhoncus sem。杜伊斯·劳里特·胡斯托·泰卢斯,在帕特·里索斯·莫莱斯蒂大学。Etiam posuere,faucibus hendrerit的生命之角,Orem Elite consequat urna,mauris的爱神猫。Donec非发酵益生菌。

到目前为止,我已经想出了这个可悲的尝试。我一直站到最后一个句号(因为量词消耗了前两个句号,所以前瞻没有失败的地方)。我只是不能把我的头围绕在它上面:

    Dim testText As String = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam felis nisi, eleifend ut quam eget, venenatis vestibulum turpis. Nam dignissim laoreet iaculis. Etiam sit amet rhoncus sem. Duis laoreet justo tellus, at volutpat risus molestie sed. Etiam posuere, arcu vitae faucibus hendrerit, lorem elit consequat urna, id congue eros felis in mauris. Donec non fermentum ipsum. Curabitur nec..."
    Dim ellipsisExpression As String = "(.*\.(?!\.\.))"
    Dim ellipsisMatch As Match
    ellipsisMatch = Regex.Match(testText, ellipsisExpression)
    If ellipsisMatch.Success Then
        testText = ellipsisMatch.Groups(1).Value
    End If
编辑:我还需要这个表达式来考虑文本中的任何
字符。例如,字符串:

`begin. this is a test... test complete. beginning shutdown... shutting down... `
应该回来

`begin. this is a test... test complete.`

此表达式的目的是在发生任何截断之前找到最流畅的文本。一个带有闭包的文本块,这样就不会让希望“获取更多”的读者感到困惑。

您可以用空字符串替换
[^.]*(?:\.{3}}|…).
,以获得所需的结果

例如:

result = Regex.Replace(input, "[^.]*(?:\\.{3}|…).*", "")
使用以下命令:

result = Regex.Replace(input, "(.+\.).+(?:\.{3}|…)\s*", "$1")
编辑:

请改用此正则表达式:

(.+[^.]\.)(?:(?:[^.]{2})|$)

您可以将其与:

.*(?<!\.)\.(?!\.)(?=(?:[^.]+|\.{3})*(?:\.{3}|…)$)
*(?
或替换

(?<!\.)\.(?!\.)(?:[^.]+|\.{3})*(?:\.{3}|…)$
(?

对于

,我想我已经想出了一个适合我的解决方案。感谢所有之前回答过的人,但这个表达式似乎满足了我的需要,执行速度不像其他一些答案那么慢。它还考虑了其他句子终止标点符号,例如
和d不仅仅是

(.*([^\.](?=\.|\?|!)(?!\.\.\.)).)

这个get是最后一个终止字符(用lookahead定义)。在本例中,它们是
,后面不跟
。这也解决了省略号字符问题,因为它实际上是一个以白名单结尾的句子。此表达式成功地找到了带有闭包的最大文本块。

我明白你的意思。但是在哪里呢有两个省略号字符,如:
这是一个测试。测试…测试…
,您提供的表达式将只替换最后一个省略号块。@JonM,这不在示例中。希望得到什么结果?如果您只想删除这些字符,请在上面的表达式中删除
$
,如
[^.]*(?:\.{3}.\124;…)
“我正试图编写一个表达式,将一块文本返回到省略号之前的一个句号或三个句号”@JonM,替换
[^.]*(?:\.{3}}|…).
空字符串应该可以。啊,我明白了,不幸的是,这对包含“…”的文本块不起作用在它们中,但尚未终止。我需要此表达式来查找最后一个句号,它不是最后一个省略号之前的省略号。我将更新我的问题谢谢你的回答:“(.+\)。+(?:\。{3}|…)\s*”
但是如果有多个以省略号结尾的句子,情况会怎样?这对文本不起作用,例如
这是一个测试。测试…测试…
,因为它将返回
这是一个测试。测试…
(?此表达式似乎受到回溯的严重影响,虽然不是灾难性的,但速度非常慢。我感谢您在这方面花费时间,但我认为我自己已经想出了一个解决方案,虽然我没有具体说明,但允许考虑其他句子终止字符。。。