正则表达式 - 匹配前导和尾随空格,开始和结束括号和单词之间的空格,但不在单词之间

时间:2012-06-27 02:51:20

标签: ruby regex

如果这个问题已经得到解答我很抱歉,但我已经搜索过,找不到答案。我正在尝试编写一个匹配所有前导和尾随空格的正则表达式,开始和结束括号之间的空格和单词,但不匹配单词之间的空格。以下是我正在解析的数据的字符串格式示例:

[Header]  
   [  SomeSpace]     
      [  Some1 More Space 15  ]       
  • 没有前导和尾随空格,括号之间没有空格,只有一个单词。

  • 一些前导和尾随空格,开口括号和尾随空格之间的空间。

  • 一些前导空格,单词和数字之间的空格,开始和结束括号之间的空格以及尾随空格。

我提出的最接近的单一正则表达式是:

/[^\[\]a-zA-Z\d]/

但我似乎无法匹配单词和数字之间的空格......

我目前使用的ruby代码作为解决方法是:

line.gsub!(/^\s*/, "")
line.gsub!(/\[/, "")
line.gsub!(/\]/, "")
s = line.gsub!(/^\s*|\s*$/, "")
s = "[" + s + "]\n"

显然,不是很漂亮......

非常感谢任何帮助将其简化为优雅的gsub系列的帮助。

谢谢!

3 个答案:

答案 0 :(得分:3)

如果我正确理解了您的问题,那么您正试图将此问题转为

[Header]  
   [  SomeSpace]     
      [  Some1 More Space 15  ]       

进入这个:

[Header]
[SomeSpace]
[Some1 More Space 15]

这个正则表达式将完成这项工作。这里的关键词是内部字符类的非贪心?量词。这使得字符类尽可能少地匹配,并在以下贪心\s*的括号内留下尾随空格(如果有的话)。

s/^\s*\[\s*([\w\s]*?)\s*\]\s*$/[$1]/g

红宝石:

line.gsub! /^\s*\[\s*([\w\s]*?)\s*\]\s*$/, '[\\1]'

sed(丑陋且很可能是非高效的......我不是sed主人!)

sed -Ee "s/^ *\[([a-zA-Z0-9 ]+)\] *$/\\1/g" -e "s/^ */[/g" -e "s/ *$/]/g" infile

答案 1 :(得分:0)

正则表达式匹配所有额外的空格以进行替换:

/(?<=^|\[)\s+|\s+(?=$|\])|(?<=\s)\s+/
  • 第一部分将匹配开始和内部括号中的所有前导空格。
  • 第二部分将匹配末尾和内括号内的所有尾随空格。
  • 最后一部分将检测2个或更多空格的序列,并删除多余的空格。

只需用空字符串替换匹配项。

测试数据

    [Header]  
   [  SomeSpace]     
      [  Some1 More Space 15  ]       
   [    Super    Space     ]     
  [    ]
  [ ]
   []
[a]
[a ]
[ a]
[   a   ]
[a a]
[a   a   a      a a  b]   [   dasdasd   dsd   ]

答案 2 :(得分:0)

我不知道优雅但最简单的可能是:

line.gsub /^\s*(\[)\s*|\s*(\])\s*$/, '\\1\\2'