5

如果这个问题已经得到解答,我深表歉意,但我已经搜索并找不到答案。我正在尝试编写一个正则表达式,它将匹配所有前导和尾随空格、左括号和右括号与单词之间的空格,但不匹配单词之间的空格。以下是我正在解析的数据的字符串格式示例:

[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 行的帮助。

谢谢!

4

3 回答 3

3

如果我正确理解了您的问题,您正试图将这段文字

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

进入这个:

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

这个正则表达式将完成这项工作。?这里的关键添加是内部字符类上的非贪婪量词。这使得字符类匹配尽可能少,并将括号内的尾随空格(如果有的话)留给后面的 greedy \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
于 2012-06-27T03:17:32.540 回答
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   ]
于 2012-06-27T03:27:11.980 回答
0

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

line.gsub /^\s*(\[)\s*|\s*(\])\s*$/, '\\1\\2'
于 2012-06-27T03:50:48.050 回答