【问题标题】:Ruby: Split a string into substring of maximum 40 charactersRuby:将字符串拆分为最多 40 个字符的子字符串
【发布时间】:2017-06-03 08:51:45
【问题描述】:

我有一些带有句子的字符串,我需要将其细分为最多 40 个字符的子字符串。 但我不想在一个单词中间拆分句子。

我尝试使用 .gsub 函数,但它最多返回 40 个字符,并避免在单词中间剪切字符串。但它只返回第一次出现。

sentence[0..40].gsub(/\s\w+$/,'')

我尝试过拆分,但我只能选择前 40 个字符并在单词中间拆分...

sentence.split(...){40}

我的字符串是"Sure, we will show ourselves only when we know the east door has been opened."。 我想要的字符串输出是

 ["Sure, we will show ourselves only when we","know the east door has
 been opened."]

你有解决办法吗?谢谢

【问题讨论】:

  • 试试sentence[/\A.{0,40}\b/m]
  • 你有句子例子,输出应该是什么?
  • @WiktorStribiżew 它只返回第一次出现。
  • @EricDuminil 我的字符串句子示例是“当然,只有当我们知道东门已经打开时,我们才会展示自己。”。我想要这个字符串输出:[“当然,只有当我们”,“知道东门已经打开时,我们才会展示自己。”]

标签: ruby-on-rails ruby regex


【解决方案1】:

你的第一次尝试:

sentence[0..40].gsub(/\s\w+$/,'')

几乎有效,但它有一个致命的缺陷。您正在拆分 截断最后一个单词之前的字符数。这意味着您无法知道被剪掉的位是整个单词还是部分单词。

因此,您的代码将总是切断最后一个单词

我会这样解决问题:

sentence[/\A.{0,39}[a-z]\b/mi]
  • \A 是将正则表达式固定到字符串开头的锚点。
  • .{0,39}[a-z] 匹配 1 到 40 个字符,其中最后一个字符必须是字母。这是为了防止最后选择的字符是标点符号或空格。 (这是理想的行为吗?您的问题并没有具体说明。如果需要,请随意调整/删除 [a-z] 部分,例如 [a-z.] 以匹配句号。)
  • \b 是单词边界环视。它是一个零宽度匹配器,位于单词的开头/结尾。
  • /mi 修饰符将包括不区分大小写(即A-Z)和多行匹配。

一个非常小的注意事项是,由于此正则表达式将 1 匹配到 40 个字符(而不是零),因此可能会得到空结果。 (虽然这看起来不太可能,因为您需要一个 1 个单词、41 个以上字母的字符串!!)为了解决这种极端情况,如果需要,请在结果上调用 .to_s


更新:感谢您对问题的改进编辑,提供了输入/结果的具体示例。这使您的要求更加清楚,因为原始帖子有些模棱两可。

您可以通过以下方式解决此问题:

sentence.scan(/.{0,39}[a-z.!?,;](?:\b|$)/mi)
  • String#scan 返回与模式匹配的字符串array - 因此您可以重新连接这些字符串以重建原始字符串。
  • 再次,我在“子字符串中的最终字符”列表中添加了更多字符 (!?,;)。您可以根据需要随意调整。
  • (?:\b|$) 表示“单词边界,或行尾”。这解决了结果不包括子字符串中的最终. 的问题。请注意,我使用了非捕获组 (?:) 来防止 scan 的结果发生变化。

【讨论】:

  • 非常感谢您的帮助,但这只是第一次出现。我的例子是“当然,只有当我们知道东门已经打开时,我们才会展示自己。”。我想要这个字符串输出:[“当然,只有当我们”,“知道东门已经打开时,我们才会展示自己。”]
  • Tom,它几乎可以工作,但我没有数组输出中的最后一个字符。我的意思是点。它可能是。 | ! | ?你有想法吗 ?谢谢你。享受你的一天;-)
  • 嗨@Blueone,我已经更新了上面的答案,因为我回到了键盘。
  • 嗨@tom-lord,您的更新有效!非常感谢你的帮助。我是开发领域的新手,但我会牢记您的建议,让我在 Stackoverflow 上的下一个问题更加清晰。美好的一天!
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 2011-11-25
  • 2015-12-28
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多