如果残留物很短,如何在不添加换行符的情况下进行文本换行



描述

假设我有很多字符串,其中一些很长:

Aim for the moon. If you miss, you may hit a star. – Clement Stone
Nothing about us without us

我想有一个文本包装做这个算法:

  1. 从字符串的开头开始,识别位置25附近最近的空白字符((
  2. 如果余数小于5个字符的长度,则不执行任何操作。如果没有,请将该空白字符替换为n
  3. 在接下来的25个字符的末尾识别下一个最近的空白字符
  4. 返回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

相关内容

  • 没有找到相关文章

最新更新