首页 > 解决方案 > 如何在最大字符数之前最后一次出现特定字符之前获取字符串?

问题描述

我有一些长但可变长度的文本,它们被分成由 . 标记的部分********************。我需要将这些文本发布到仅接受 2048 个字符的字段中,因此我需要将该文本分成不超过 2048 个字符但不包含不完整部分的组。

到目前为止我的正则表达式是^([\s\S]{1,2048})([\s\S]{1,2048})([\s\S]{1,2048})

但是,这有两个问题:

1) 它将文本分成可以包含不完整部分的组。我想要的是一个完整的部分,即使它不是完整的 2048 个字符。假设下面的示例在 2048 个字符的末尾。

这是我的实际结果。请注意,“7 分钟锻炼”部分在中段被切断

********************
Maybe Baby™ Period & Fertility ()
Popular app for tracking your periods and predicting times of fertility; recommended; avg 4.5/5 stars (3,500+ ratings); 50% off, $3.99 ↘️ $1.99!
https://example.com/2019/07/29/maybe-baby-period-fertility-7-29-19/
********************
7 Minute Workout: Lose Weight ()
Scientifically-proven and featured by the New York Times, a 7-minute high intensity workout proven to lose weig

这是我想要的结果。请注意,“7 分钟锻炼”部分被完全省略,因为在 2048 个字符限制下无法完整包含它。

********************
Maybe Baby™ Period & Fertility ()
Popular app for tracking your periods and predicting times of fertility; recommended; avg 4.5/5 stars (3,500+ ratings); 50% off, $3.99 ↘️ $1.99!
https://example.com/2019/07/29/maybe-baby-period-fertility-7-29-19/

2)这个正则表达式的第二个问题是我需要输入的文本长度变化很大;它可能小于 2048 或可能超过 10,000 个字符。我的正则表达式显然只适用于长达 6,144 个字符的文本。我是否只是疯狂地重复正则表达式多次以获得比我可以输入的最长文本更长的时间,还是有办法让它重复?

附录:有几个人询问了这个问题的用例/环境。不,它不是垃圾邮件机器人。相反,我正在尝试使用 Apple 的 Shortcuts 应用程序将项目从我的网站交叉发布到 Kik 上的关注者。不幸的是,Kik 有 2048 个字符的限制,所以我不能一次发布所有内容。我正在尝试使用正则表达式将文本拆分为适当的部分,以便我可以从快捷方式中复制它们并将它们一次粘贴到 Kik 中。

标签: regex

解决方案


夫妻注意事项:

  • 根本不需要使用组,只需直接使用匹配结果,因为每个匹配代表一个部分。

  • ?通过添加after来使用惰性量词而不是贪婪,{1,2048}以使匹配在正确的位置切割。

  • 在我的正则表达式中,我只使用了 Globalg而没有 multiline m

  • 下面的代码仅适用于包含 2048 个字符或更少字符的部分。如果该部分的字符数超过 2048 个,则将被跳过。

  • 下面的正则表达式使用 Positive Lookahead 来表示该部分的结束而不匹配。

这是正则表达式:

^|\*[\s\S]{1,2048}?(?=\n\*|$)

示例:https ://regex101.com/r/hezvu5/1/

==== 更新 ====

为了使结果贪婪,匹配尽可能多的部分而不分割最后一个部分,使用这个正则表达式:

^|\*[\s\S]{1,2048}(?=\n\*|$)

推荐阅读