5

この質問にすでに回答されている場合はお詫び申し上げますが、検索して回答が見つかりません。すべての先頭と末尾のスペース、開始ブラケットと終了ブラケットの間のスペース、および単語と一致する正規表現を作成しようとしていますが、単語間のスペースとは一致しません。以下は、私が解析しているデータの文字列形式の例です。

[Header]  
   [  SomeSpace]     
      [  Some1 More Space 15  ]       
  • 先頭と末尾のスペースはなく、角かっこと1つの単語の間にスペースはありません。

  • いくつかの先頭と末尾のスペース、開始ブラケットと末尾のスペースの間のスペース。

  • 先頭のスペース、単語と数字の間のスペース、開始ブラケットと終了ブラケットの間のスペース、および末尾のスペース。

私が思いついた最も近い単一の正規表現は次のとおりです。

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

しかし、私は単語と数字の間のスペースだけを一致させないようには思えません...

現在回避策として使用しているルビーコードは次のとおりです。

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 番目の部分は、ブラケットの最後と内側のすべての後続スペースに一致します。
  • 最後の部分は、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 に答える