2016-10-08 11 views
0

正規表現に問題があります。これは、メモ帳++で検索/置換する必要があります。私はプロセスを完了するために2つの別々の検索が必要であれば問題ありません。メモ帳++正規表現で区切られた単一の文字を見つける正規表現

基本的には、CSVの各行の先頭と末尾に|を追加し、,をすべて|に置き換える必要があります。

col1,col2,col3,col4,col5,col6 
name,desc,something,else,here,too 
another,,three,,, 
single,characters,here,a,b,c 
last,line,here,,almost, 

結果::

|col1|col2|col3|col4|col5|col6| 
|name|desc|something|else|here|too| 
|another||three|||| 
|single|characters|here| a | b | c | 
|last|line|here||almost|| 
その後、唯一の1文字で任意の値に、私はそれぞれの側に文字の周りに二つのスペースを配置する必要があり

ソース( "A" は "A" となります)

行の先頭と末尾に|を追加するだけで十分ですが、,|に置き換えることは明らかに簡単です。しかし、私は|x|を見つけるために正規表現を思い出すことはできません。xは1文字に制限されています。私はそれが簡単だと確信していますが、私は正規表現には新しいです。

答えて

2

正規表現:

(?:(^)|(?!^)\G)(?:([^\r\n,]{2,})|([^\r\n,]))?(?:(,$)|(,)|($)) 

置換文字列:

(?{1}|)(?{2}\2)(?{3} \3 )(?{4}||)(?{5}|)(?{6}|) 

、醜い汚いと長いが、作品。

正規表現説明

(?:     # Start of non-capturing group (a) 
    (^)     # Assert beginning of line (CP #1) 
    |     # Or 
    (?!^)    # // 
    \G     # Match at previous matched position 
)     # End of non-capturing group (a) 

(?:     # Start of non-capturing group (b) 
    ([^\r\n,]{2,})  # Match characters with more than 2-char length (any except \r, \n or `,`) (CP #2) 
    |     # Or 
    ([^\r\n,])   # Match one-char string (CP #3) 
)?     # Optional - End of non-capturing group (b) 

(?:     # Start of non-capturing group (c) 
    (,$)    # Match `,$` (CP #4) 
    |     # Or 
    (,)     # Match single comma (CP #5) 
    |     # Or 
    ($)     # Assert end of line (CP #6) 
)     # End of non-capturing group (c) 
+0

ここに2:30 AM私は説明を追加する新鮮ではない。しかし、私はできるだけ早くやります。 – revo

+1

+1ステップソリューションであることは+1ですが、マルチステップソリューションははるかに読みやすく(マクロとしても使用できる)と思いますが、 –

+0

あなたは正しいですし、私は狂っています。 – revo

1

最初の置換は、最初と最後で、コンマを置き換える:

Search: ^|$|, 
Replace: | 

二置き換えることは、単一文字の一致の周りにスペースを追加します。

Search: (?<=[|])([^|])(?=[|]) 
Replace: $1 

左にと$ 1の右側にスペースを追加します。

+0

はあなたがテストしたことがありますか?たとえあなたがパイプから逃げても、2つ目は機能しません。 –

+0

@SebastianProske私は自分のiPhoneにいるので、今はテストできません。表現に何が問題なの? – dasblinkenlight

+0

'[|](。)[|]'はトリプル '|'にマッチし、複数の単一文字のシーケンスでは動作しません( '| a | b | c |') –

1

3段階のソリューション:

  • パターン:^.+$交換:​​
  • パターン:,交換:|
  • パターン:(?<=\|)([^|\r\n])(?=\|)交換:$0
関連する問題