正则表达式 - 匹配前导和尾随空格,开闭括号之间和单词之间的空格,但不匹配单词内部的空格。

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操作,将不胜感激。

谢谢!

Lee

3个回答

3
如果我理解您的问题正确,您正在尝试转换此文本。
[Header]  
   [  SomeSpace]     
      [  Some1 More Space 15  ]       

将其转化为如下形式:

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

这个正则表达式可以完成任务。关键之处在于内部字符类上的非贪婪 ? 量词。这使得字符类尽可能少地匹配,并将尾随空格留在括号内(如果有的话),以便供接下来的贪婪 \s* 使用。
s/^\s*\[\s*([\w\s]*?)\s*\]\s*$/[$1]/g

Ruby:

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
sed 不支持非贪婪量词 - 我会看看是否能想出替代方案 :) - Jon Gauthier

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   ]

非常感谢您的输入,我认为它会很好地完成任务。 - Lee Graham

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接