Ruby实现按最大50字符拆分字符串(不拆分单词、保留换行空格)
问题解决方案
一、文本按每行最多50字符拆分(不拆分单词)
你之前用的正则/[^ \n]{1,50}/会匹配不含空格/换行的连续字符,必然会拆分单词,这是核心问题。下面提供两种可行方案:
方案1:正则扫描法
利用正向预查匹配空格或字符串结尾,确保每次截取的内容不会截断单词:
str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vestibulum id augue id mattis. Praesent congue nisi quam, ac gravida enim viverra non. Vestibulum id interdum sapien, vitae volutpat nisi. Praesent id euismod ipsum. Vestibulum et pulvinar urna, id venenatis ante. Cras commodo eget ligula sit amet mattis. Maecenas congue turpis urna, a bibendum sem consequat nec." formatted_str = str.scan(/.{1,50}(?=\s|$)/).map(&:strip).join("\n") puts formatted_str
- 正则
/.{1,50}(?=\s|$)/:匹配1-50个任意字符,且后面必须是空格或字符串结尾,保证不会拆分单词。 map(&:strip)用于移除每行首尾可能存在的空格,避免换行后开头出现空格的问题。
方案2:循环定位法
如果对正则不太熟悉,也可以用循环手动定位空格位置:
str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vestibulum id augue id mattis. Praesent congue nisi quam, ac gravida enim viverra non. Vestibulum id interdum sapien, vitae volutpat nisi. Praesent id euismod ipsum. Vestibulum et pulvinar urna, id venenatis ante. Cras commodo eget ligula sit amet mattis. Maecenas congue turpis urna, a bibendum sem consequat nec." lines = [] current_pos = 0 max_length = 50 while current_pos < str.length end_pos = [current_pos + max_length, str.length].min # 从end_pos往前找最近的空格,确保不拆分单词 space_pos = str.rindex(' ', end_pos) if space_pos && space_pos > current_pos lines << str[current_pos...space_pos].strip current_pos = space_pos + 1 else # 极端情况:单个单词超过50字符,直接截取(题目中未出现此情况) lines << str[current_pos...end_pos].strip current_pos = end_pos end end puts lines.join("\n")
二、正则贪婪匹配疑惑解答
针对你的示例字符串str = "(again)and again)and again)",逐一解释:
/\(.+\)/匹配结果为(again)and again)and again).+是贪婪匹配模式,会尽可能匹配最多的字符。它从第一个(开始,会把中间的)也当作普通字符匹配,直到遇到字符串最后一个)才停止,因此会匹配到最长的符合开头(和结尾)的内容。
/\(.+?\)/匹配结果为(again).+?是非贪婪(惰性)匹配模式,会尽可能匹配最少的字符。从第一个(开始,只要遇到第一个)就停止匹配,所以只取到第一个完整的括号对。
/\(.{1,15}\)/无法得到预期的(again)and again)- 这个正则的逻辑是:匹配
(后接1-15个任意字符,然后必须是)。但(again)and again)的长度(从第一个(到第二个))是17个字符,超过了15的上限,因此无法匹配。如果想要匹配到这个内容,需要把长度上限调整为17,即/\(.{1,17}\)/。
- 这个正则的逻辑是:匹配
内容的提问来源于stack exchange,提问作者Philippe Perret
相关产品推荐
相关产品推荐

