如果残差很短,如何在不添加换行符的情况下进行文本换行?
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
我想要一个执行此算法的文本包装器:
- 从字符串的开头开始,找出位置 25
附近最近的空白字符 (
)
- 如果余数小于5个字符长度,则什么都不做。如果不是,请将空白字符替换为
\n
- 在接下来的 25 个字符的末尾识别下一个最接近的空白字符
- 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
- 匹配模式:
(.{1,25})( +|$\n?)
- 替换模式:
\n
但这会产生Nothing about us without\nus
,这是不可取的。
尝试 2
使用 Lookahead Construct in a If-Then-Else Conditionals:
- 匹配模式:
(.{1,25})(?(?=(.{1,5}$).*))( +|$\n?)
- 替换模式:
\n
它仍然产生 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
描述
说我有很多字符串,有些字符串很长:
Aim for the moon. If you miss, you may hit a star. – Clement Stone
Nothing about us without us
我想要一个执行此算法的文本包装器:
- 从字符串的开头开始,找出位置 25 附近最近的空白字符 (
- 如果余数小于5个字符长度,则什么都不做。如果不是,请将空白字符替换为
\n
- 在接下来的 25 个字符的末尾识别下一个最接近的空白字符
- 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
- 匹配模式:
(.{1,25})( +|$\n?)
- 替换模式:
\n
但这会产生Nothing about us without\nus
,这是不可取的。
尝试 2
使用 Lookahead Construct in a If-Then-Else Conditionals:
- 匹配模式:
(.{1,25})(?(?=(.{1,5}$).*))( +|$\n?)
- 替换模式:
\n
它仍然产生 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