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 个字符。我的正则表达式显然只适用于长达 6,144 个字符的文本。我是否只是疯狂地重复正则表达式多次以获得比我可以输入的最长文本更长的时间,还是有办法让它重复?
附录:有几个人询问了这个问题的用例/环境。不,它不是垃圾邮件机器人。相反,我正在尝试使用 Apple 的 Shortcuts 应用程序将项目从我的网站交叉发布到 Kik 上的关注者。不幸的是,Kik 有 2048 个字符的限制,所以我不能一次发布所有内容。我正在尝试使用正则表达式将文本拆分为适当的部分,以便我可以从快捷方式中复制它们并将它们一次粘贴到 Kik 中。
解决方案
夫妻注意事项:
根本不需要使用组,只需直接使用匹配结果,因为每个匹配代表一个部分。
?
通过添加after来使用惰性量词而不是贪婪,{1,2048}
以使匹配在正确的位置切割。在我的正则表达式中,我只使用了 Global
g
而没有 multilinem
。下面的代码仅适用于包含 2048 个字符或更少字符的部分。如果该部分的字符数超过 2048 个,则将被跳过。
下面的正则表达式使用 Positive Lookahead 来表示该部分的结束而不匹配。
这是正则表达式:
^|\*[\s\S]{1,2048}?(?=\n\*|$)
示例:https ://regex101.com/r/hezvu5/1/
==== 更新 ====
为了使结果贪婪,匹配尽可能多的部分而不分割最后一个部分,使用这个正则表达式:
^|\*[\s\S]{1,2048}(?=\n\*|$)
推荐阅读
- google-apps-script - 仅备份值或在备份后将公式转换为值
- java - 当您使用朴素贝叶斯算法拼错单词时,获取字典(数据库)的接近单词
- bash - 如何在bash的if-else中使用变量?
- listview - Listview.builder 在颤振上创建重复项目
- python - 无法在此网格中并排对齐特定图案
- javascript - 不同类型的表单数据 - 有没有更好的方法来预览输入数据?
- vb.net - VB.NET UserControl 暴露为 ActiveX 控件 VisibleChanged 在 VB6 中运行时未调用
- html - 图像锁定左侧尝试了所有 html 查询
- c++ - 如何在不删除对象本身的情况下删除指向对象数组的指针?C++
- arrays - 如何美化json中的输出?