如何从字符串中间删除空格但在开头保留空格?

How can I delete whitespace from middle of string but keep whitespace at beginning?

几年前,我们所有的 Apache 配置文件都更改为到处都是空白(见下文,不知道是谁做的)。由于我要从 2.2 升级到 2.4,因此很难找到并替换所有必需的配置更改。

我想去掉中间的空白,但保留前面的空白。我知道如何在开头、结尾和任何地方替换。我什至查阅了几本书(例如 Jeff Friedl 的正则表达式),但我无法理解这个问题——甚至不确定这是否可能。

  <Directory            "THEDIRECTORY">
    <LimitExcept        GET POST>
      deny              from all
    </LimitExcept>
    Options             -Indexes -MultiViews
    AllowOverride       All
    Order               allow,deny
    Allow               from all
  </Directory>

我想要的是:

  <Directory "THEDIRECTORY">
    <LimitExcept GET POST>
      deny from all
    </LimitExcept>
    Options -Indexes -MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>

因此我可以轻松搜索并替换 apache 2.4 的配置更改

我还以为是最后来的

s/\s+(.*)\s+(.*)\s+$//g

但是由于多种原因这不起作用,包括替换的数量发生变化,它们是一个非固定数字。

求助,我一窍不通

您可以使用此正则表达式一次匹配两个或更多个水平白色space,并将其替换为单个 space。

(?<=\S)\h{2,}(?=\S)

这个正则表达式确保只有 space 会被一些使用 \S

包围的非 space 字符匹配

Regex Demo

如果您的正则表达式不支持 \h,您可以只使用 space 而不是 \h 并将您的正则表达式写为,

(?<=\S) {2,}(?=\S)

Demo using space only

确保将以下行添加到 .htaccess 或 apache conf 文件的目录标记中(如果尚不存在):

RewriteEngine On

然后在下方添加

RewriteCond %{REQUEST_URI} \s

RewriteRule .* https://DOMAIN_NAME/ [R=301,L]

正在替换 DOMAIN_NAME。