2012-07-28 21 views
5

私は見つけようとして代替単語全体、「単語全体」私は意味でよ、私はVB6 &正規表現正規表現正規表現は、唯一

で働いていることを示すことによって、これを前置きする必要があり、全体の単語を検索と置換します有効な一致は別の単語の部分文字列ではありませんが、一部の特殊文字は大丈夫です。私は正規表現の初心者です。これは私が試していたものです:

([^a-z]+)(Foo)([^a-z]+) 

これは近いようですが、特定の状況でいくつかの問題があります。例えば

、私は、文字列を見つけた場合

Foo Foo 

または

Foo(Foo) 

または

どこでもラインがfooで終了し、次の行は、いずれにおいてもFooの

This is a line with Foo 
Foo starts the next line 

で始まりますこれらのケースのうち最初のFooのみがマッチします。

まあ、それはマッチではなく、私の置き換え方法では問題ではないかもしれません。私はそれをどのように確認できるか正確にはわかりません。

regEX.Replace(source, "$1" & newstring & "$3") 

だから私はマッチングを避けたいの要約で: FooBarの BarFoo

次のいずれかが有効になりますので、は次のように私は、表現にマッチしているバウンディング何でも炭交換するグループを使用していますマッチ:

はFooはFoo
フーバー
FOO_BAR
Foo.bar
はFoo、バー
はFoo(バー)
はFoo(フー)

誰もが親切に私にこれを行うための適切な方法を示すことができる場合、私はそれを大幅にいただければ幸いです!

は、私があまりにもすぐ下の最初の解決策について少し話したように見えます

を編集しました。少しテストした後にもう少し読んだら、アンダースコアは単語のcharであることがわかります。したがって、上記のパターンは一致しません。私はこれを思いついたのですが、これは良い方法ですか?

(\b)(Foo)(\b|_) 

regEX.Replace(source, "$1" & newstring & "$3") 

これは機能しますが、少しうっすらそうです。

答えて

6

「単語境界」式\bを使用してください。

おそらく、このような単純なものは何でしょう:

(.*)\bFoo\b(.*) 

FYI、単語境界表現\bが単語文字\wと非単語の文字​​またはその逆の間にゼロ幅マッチです入力を消費しません。


アンダースコアと数字の文字は、そうFoo_Bar、 "単語文字" Bar_Fooとみなされ、そしてFoo123は一致しません。任意の非文字が(入力の開始と終了を含む)「の単語の終わり」とみなされように、その是正をルックアラウンドを使用するには:

(?i)(.*(?<![^a-z]))Foo((?![^a-z]).*) 
+1

BIG感謝を。私は正規表現について学ぶことが大変です。私は小さな変更を加える必要がありましたが、それはトリックを行ったようです。単純に\ bFoo \ b –

+0

まあ、それは完全ではありませんでした。私は上記の私の元の投稿を修正しました。コメントは大歓迎です。 –

+0

アンダースコアは "単語文字"と見なされるので、\ bは文字とアンダースコアの間で一致しません。しかし、それをやる方法はあります。 – Bohemian