2016-05-21 10 views
1

正規表現をどのように置き換えてすべて置換するか?一致するものが見つからなくなるまで正規表現を置き換えます。

例えば、4時間後に"(\w{3} \d{1,9})\r?\n\w{2} (\d)""$1$2"に置き換えると、結果が得られます。

テキスト:

foo 1 
ba 1 
ba 2 
ba 3 
ba 4 
foo 2 
ba 1 
ba 2 
foo 3 
ba 1 
ba 2 
ba 3

結果:

例コード:

Dim regEx_, stxt 
stxt = "foo 1" & VBcr & "ba 1" & VBcr & "ba 2" & VBcr & "ba 3" & VBcr _ 
    & "ba 4" & VBcr & "foo 2" & VBcr & "ba 1" & VBcr & "ba 2" & VBcr _ 
    & "foo 3" & VBcr & "ba 1" & VBcr & "ba 2" & VBcr & "ba 3" 

Set regEx_ = New RegExp 
With regEx_ 
    .Global = True 
    .MultiLine = True 
    .IgnoreCase = True 
    .Pattern = "(\w{3} \d{1,9})[\r?\n]\w{2} (\d)" 
    stxt = regEx_.Replace(stxt, "$1$2") 
    stxt = regEx_.Replace(stxt, "$1$2") 
    stxt = regEx_.Replace(stxt, "$1$2") 
    stxt = regEx_.Replace(stxt, "$1$2") 
    stxt = regEx_.Replace(stxt, "$1$2") 'to make sure (real example some time contains up to 30 replacements) 
End With 
MsgBox stxt 

一致が見つからなくなるまで、私は置き換えることができます方法はありますか?このように:

Do Until regEx_.Test(stxt) 
    stxt = regEx_.Replace(stxt, "$1$2") 
Loop 
+1

質問とどのような期待される出力があるとは何ですか? – AKS

+2

'[\ r \ n] + \ w {2} \ s +'正規表現で空文字列に置き換えてみてください。 –

+0

これは近いです。すべてのバを交換する必要はありません。 fooが先行するbaのみ。しかし、ありがとう。私は思っていませんでしたが、結果を期待していませんでした。 – Rahul

答えて

2

、あなたの表現を少し変更し、2文字のラインからすべての非数字を削除するには2番目の正規表現でreplacement functionを使用する場合は、ループを必要としない:

Function Merge(m, sm1, sm2, pos, src) 
    Set re = New RegExp 
    re.Global = True 
    re.Pattern = "\D" 

    Merge = sm1 & re.Replace(sm2, "") 
End Function 

Set regEx_ = New RegExp 
regEx_.Global = True 
regEx_.Pattern = "(\w{3} \d{1,9})((?:[\r?\n]\w{2} \d)+)" 

stxt = regEx_.Replace(stxt, GetRef("Merge")) 

((?:[\r?\n]\w{2} \d)+):正規表現に加えた変更では、キャプチャしていないグループ((?:...))を使用して、後に続く2文字の行(+)に一致します。外側の括弧セットは、置換機能に2番目のサブダッチ(sm2)として渡された1つのグループ内の後続の2文字の行をキャプチャします。

置換関数は、第1の部分マッチ(sm1(\w{3} \d{1,9}))に連結されているだけの数字を残して、二文字の行からすべての数字以外の文字(\D)を除去するために第2の正規表現を使用します。

基本的に、このような文字列は:次に

 

ba 1 
ba 2 
ba 3 
ba 4

交換機能:

foo 1

sm2(主要改行付き):

foo 1 
ba 1 
ba 2 
ba 3 
ba 4

は、二つのサブマッチsm1を与えます番号を除くすべてを削除しますsm2

1234

sm1にすることを追加:

Merge = "foo 1" & "1234" 
+0

非常に複雑です。私に理解させてください。 – Rahul

+0

これは素晴らしいです.. – Rahul

2

あなたは近くでした。これを試してみてください。

Do While regEx_.Test(stxt) 
    stxt = regEx_.replace(stxt, "$1$2") 
Loop 
関連する問題