描述
假设我有很多字符串,其中一些很长:
Aim for the moon. If you miss, you may hit a star. – Clement Stone
Nothing about us without us
我想有一个文本包装做这个算法:
- 从字符串的开头开始,识别位置25附近最近的空白字符(
(
- 如果余数小于5个字符的长度,则不执行任何操作。如果没有,请将该空白字符替换为
n
- 在接下来的25个字符的末尾识别下一个最近的空白字符
- 返回2直到行结束
因此文本将被替换为:
Aim for the moon. If younmiss, you may hit a star.n– Clement Stone
Nothing about us without us
尝试1
使用正则表达式查询包装文本
- 匹配模式:
(.{1,25})( +|$n?)
- 更换模式:
$1n
但这将产生Nothing about us withoutnus
,这是不可取的。
尝试2
在If Then Else条件中使用前瞻性构造:
- 匹配模式:
(.{1,25})(?(?=(.{1,5}$).*))( +|$n?)
- 更换模式:
$1$2n
它仍然产生Nothing about us withoutnus
,这是不可取的。
基于@sln的?另一个换行问题的答案。
我所添加的只是添加换行符的替代点:
"最多扩展5个字符,直到换行或EOS"开始"之前;
并将允许的字符数从50
更改为25
[^rn]{1,5}(?=r?n|$)
压缩
(?:((?>.{1,25}(?:[^rn]{1,5}(?=r?n|$)|(?<=[^Srn])[^Srn]?|(?=r?n)|$|[^Srn]))|.{1,25})(?:r?n)?|(?:r?n|$))
更换
$1
后接换行
$1rn
预览
https://regex101.com/r/pRqdhi/1
详细的正则表达式
(?:
# -- Words/Characters
( # (1 start)
(?> # Atomic Group - Match words with valid breaks
.{1,25} # 1-N characters
# Followed by one of 4 prioritized, non-linebreak whitespace
(?: # break types:
[^rn]{1,5}(?=r?n|$) # Expand by up to 5 characters until before a linebreak or EOS
|
(?<= [^Srn] ) # 1. - Behind a non-linebreak whitespace
[^Srn]? # ( optionally accept an extra non-linebreak whitespace )
| (?= r? n ) # 2. - Ahead a linebreak
| $ # 3. - EOS
| [^Srn] # 4. - Accept an extra non-linebreak whitespace
)
) # End atomic group
|
.{1,25} # No valid word breaks, just break on the N'th character
) # (1 end)
(?: r? n )? # Optional linebreak after Words/Characters
|
# -- Or, Linebreak
(?: r? n | $ ) # Stand alone linebreak or at EOS
)
如果您的输入是逐行运行的,并且行的中间没有换行符,那么您可以尝试以下操作:
- 图案:
(.{1,25}.{1,5}$|.{1,25}(?= ))
- 替换:
$1n
然后应用这个:
- 图案:
n
- 替换:
n