将文本主体拆分为句子,但保留标点符号?

6

我正在尝试生成两个带有HTML标记的文本之间可读性强的类似维基百科的差异。我使用diff-lcs,第一步是将字符串(字符数组)分成句子数组,但保留它们的标点符号。

"I am a lion. Hear me roar! Where is my cub? Never mind, found him.".magic_split(/[.?!]/)
# => "I am a lion." "Hear me roar!" "Where is my cub?" "Never mind, found him."

这应该能解决问题。
"I am a lion. Hear me roar! Where is my cub? Never mind, found him.".gsub(/[.?!]/, '\1|').split('|')

除了gsub似乎无法插入字符.?!,它返回的是这个:
"I am a lion| Hear me roar| Where is my cub| Never mind, found him|"

什么是最简单的非破坏性分割方式?即保留用于进行分割的字符。
2个回答

13

scan 应该能解决问题(将 strip 放在那里以去除尾随空格)。

s = "I am a lion. Hear me roar! Where is my cub? Never mind, found him."
s.scan(/[^\.!?]+[\.!?]/).map(&:strip) # => ["I am a lion.", "Hear me roar!", "Where is my cub?", "Never mind, found him."]

如果您想捕捉以“...”结尾的句子,您将如何编辑此内容?例如:“我是一只狮子。听我咆哮!我的幼崽在哪里?没关系,找到他了…” - michaelsking1993
我已经编辑成如下形式:text.scan(/[^\.!?]+[\.!?]+/).map(&:strip) 唯一的问题是如何捕获没有句号的最后一句话:"我是一只狮子。听我咆哮!你叫什么名字?不要评判我",会漏掉最后的"不要评判我"。 - michaelsking1993
1
工作解决方案:text.scan(/[^\.!?]+[\.!?]+|[^\.!?]+.\z/).map(&:strip)(可能有更优雅的方法,但这个是有效的)。输入:“我是一只狮子...听我咆哮!!你叫什么名字?不要评判我” --> 输出:["我是一只狮子...", "听我咆哮!!", "你叫什么名字?", "不要评判我"] - michaelsking1993

3
我认为应该是\0
>> string = "I am a lion. Hear me roar! Where is my cub? Never mind, found him."
>> string.gsub(/[.?!]/, '\0|') 
   # "I am a lion.| Hear me roar!| Where is my cub?| Never mind, found him.|"

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