【问题标题】:Removing leading, trailing and multiple spaces within a string删除字符串中的前导、尾随和多个空格
【发布时间】:2013-09-26 05:31:02
【问题描述】:

我想删除所有前导和尾随空格。以及用字符串中的单个空格替换多个空格,以便字符串中的所有单词都由单个空格完全分隔。

我可以使用以下两次正则表达式迭代并寻找 single regex 解决方案来实现这一点。

s/^\s+|\s+$//g
s/\s+/ /g

示例输入:

   word1   word2 word3     word4    

期望的输出:

word1 word2 word3 word4

如果您能帮我解决这个问题,将不胜感激。

【问题讨论】:

  • @alfasin 我认为他正在使用 sed,所以 bash 是我的猜测。
  • @alfasin 任何语言都可以。我正在寻找一般的正则表达式。在 perl 中实现
  • @SilviuBurcea s///g 也适用于 perl。赛德也不错。我只是在寻找正确的方法。
  • 嗯,看来杰瑞已经解决了“中间”的情况。我不确定是否可以将“some”\s* 替换为空字符串,而将其他 \s* 替换为单个空格 - 使用相同的 正则表达式,但如果可行的话 - 我会喜欢看到答案(用 2-3 个正则表达式分别解决它们不是挑战吗?:))

标签: regex perl sed


【解决方案1】:

你可以使用类似的东西:

s/^\s+|\s+$|\s+(?=\s)//g

\s+(?=\s) 将匹配字符串中间的所有空格并保留一个。

【讨论】:

  • 像魅力一样工作。谢谢 :) 仍然渴望看到其他方法。
【解决方案2】:

在 Javascript 中,字符串原型有两种方法可以管理这个:

str.trim().replace(/\s+/g, ' ')

str.trim() 将删除前导和尾随空格

str.replace(regex, replacement) 将返回一个新字符串(对原始str 没有破坏性),其中regex 将与提供的字符串进行比较,匹配的第一个实例将替换为replacement,然后是整个新字符串被退回。

需要注意的重要一点:.replace 的第一个参数不应该用引号封装。正则表达式用斜杠 (/regex/) 分隔,然后附加 g 表示全局替换(每个匹配的实例),而不是仅仅基于 lastIndex 替换第一个或下一个实例(最初为 0,给出第一个实例)。您可以阅读更多关于 lastIndex 以及我在提供的第二个链接中提到的所有内容。

示例:

var str = '  1 2  3   4  '
function trimReplace(str){
   newStr = str.trim().replace(/\s+/g, ' ');
   console.log(newStr);
}
trimReplace(str)

在您的控制台中试试这个: ' 1 2 3 4 '.trim().replace(/\s+/g, ' ')

“1 2 3 4”

_

正则表达式:kleene operators 将帮助您了解用于匹配多个空格的正则表达式

正则表达式:helpful guide on regex and /g flag

谷歌:MDN string.protoype.trim()

谷歌:MDN string.prototype.replace()

【讨论】:

【解决方案3】:

使用awk

echo "   word1   word2 word3     word4  " | awk '{$1=$1}1'
word1 word2 word3 word4

这个$1=$1 是一个让一切集中注意力的技巧。

你甚至可以使用

awk '$1=$1' file

但如果第一个字段是 00.0 它将失败

【讨论】:

  • 感谢您的回复。我不太熟悉awk,但想试试这个。
【解决方案4】:

这可能对你有用(GNU sed):

sed -r 's/((^)\s*(\S))|((\S)\s*($))|(\s)\s*/\2\3\5\6\7/g' file

或者简单地说:

sed -r 's/(^\s*(\S))|((\S)\s*$)|(\s)\s*/\2\4\5/g file

【讨论】:

  • 虽然我花了一些时间来理解,但我得到了它的工作。不同的捕获方法扔掉不必要的!
  • sed 大师来袭! ;-) +1
  • sed 对s/^\s+|\s+$|\s+(?=\s)//g 有问题吗?
  • @mpapec 前两个交替是正则表达式对 sed 的通用,而最后一个不是。
【解决方案5】:

如果您使用的是 UNIX,则可以利用 shell 的 Word-splitting。使用下面的命令替换的 Bash 示例

STR="   word1   word2 word3     word4  "
z=$(echo $STR)
echo "$z"
word1 word2 word3 word4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2011-10-02
    相关资源
    最近更新 更多