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

How to do text wrapping without adding newline if the residue is short?

描述

说我有很多字符串,有些字符串很长:

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

我想要一个执行此算法的文本包装器:

  1. 从字符串的开头开始,找出位置 25
  2. 附近最近的空白字符 ( )
  3. 如果余数小于5个字符长度,则什么都不做。如果不是,请将空白字符替换为 \n
  4. 在接下来的 25 个字符的末尾识别下一个最接近的空白字符
  5. Return 到 2 直到行尾

因此该文本将被替换为:

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

尝试 1

咨询Wrapping Text With Regular Expressions

但这会产生Nothing about us without\nus,这是不可取的。

尝试 2

使用 Lookahead Construct in a If-Then-Else Conditionals:

它仍然产生 Nothing about us without\nus,这是不可取的。

根据@sln 的创建? answer to a different word wrap problem.

我添加的只是这个添加换行符的替代点:

“在换行符或 EOS 之前最多扩展 5 个字符”

并将允许的字符数从 50 更改为 25

[^\r\n]{1,5}(?=\r?\n|$)

压缩

(?:((?>.{1,25}(?:[^\r\n]{1,5}(?=\r?\n|$)|(?<=[^\S\r\n])[^\S\r\n]?|(?=\r?\n)|$|[^\S\r\n]))|.{1,25})(?:\r?\n)?|(?:\r?\n|$))

替换

</code> 后跟一个换行符</p> <pre><code>\r\n

预览

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:
                     [^\r\n]{1,5}(?=\r?\n|$) # Expand by up to 5 characters until before a linebreak or EOS
                  |
                     (?<= [^\S\r\n] )        # 1. - Behind a non-linebreak whitespace
                     [^\S\r\n]?              #      ( optionally accept an extra non-linebreak whitespace )
                  |  (?= \r? \n )            # 2. - Ahead a linebreak
                  |  $                       # 3. - EOS
                  |  [^\S\r\n]               # 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}(?= ))
  • 替换:\n

然后应用这个:

  • 模式:\n
  • 替换:\n