如何在最大字符数之前在最后一次出现特定字符之前获取字符串?

时间:2019-07-31 04:52:36

标签: regex

我有一些长而变长的文本,这些文本分为********************标记的部分。我需要将这些文本发布到仅接受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个字符。我的正则表达式显然仅适用于最长6144个字符的文本。我只是不断地重复复制正则表达式一次,以获得比我可以输入的最长文本更长的时间,还是有办法重复它?

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

1 个答案:

答案 0 :(得分:0)

夫妇注释:

  • 根本不需要使用组,只需直接使用比赛结果即可,因为每个比赛代表一个分区。

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

  • 在我的正则表达式中,我只使用了全局g,而没有使用多行m

  • 以下代码仅适用于2048个字符以下的部分。如果该部分的字符数超过2048个,则会被跳过。

  • 下面的正则表达式使用正向超前来表示该部分的末尾而不匹配。

这是正则表达式:

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

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

====更新====

要使结果贪婪,以匹配尽可能多的部分而不拆分最后一部分,请使用此正则表达式:

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