如果这个问题已经得到解答我很抱歉,但我已经搜索过,找不到答案。我正在尝试编写一个匹配所有前导和尾随空格的正则表达式,开始和结束括号之间的空格和单词,但不匹配单词之间的空格。以下是我正在解析的数据的字符串格式示例:
[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系列的帮助。
谢谢!
利
答案 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+/
只需用空字符串替换匹配项。
测试数据
[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'