【问题标题】:Regex - matching leading and trailing spaces, spaces between opening and closing brackets and words, but not between words正则表达式 - 匹配前导和尾随空格、左括号和右括号和单词之间的空格,但不匹配单词之间的空格
【发布时间】:2012-06-27 02:51:20
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    如果我正确理解了你的问题,你正试图把这段文字转过来

    [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
    

    【讨论】:

    • sed 不支持非贪婪量词 - 我会看看我是否可以想出一个替代方案:)
    【解决方案2】:

    正则表达式匹配所有多余的空格进行替换:

    /(?<=^|\[)\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   ]
    

    【讨论】:

    • 非常感谢您的意见,我认为它会做得很好。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多