7

私はVB6とRegExpで作業していることを述べて、これを序文にする必要があります

「単語全体」とは、有効な一致が別の単語の部分文字列ではないことを意味しますが、一部の特殊文字は問題ありません。私は正規表現の初心者です。これは私が試していたものです:

([^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.bar
Foo、bar
Foo(バー)
Foo(Foo)

誰かがこれを行う適切な方法を親切に教えてくれれば、とても感謝しています!

編集済み

以下の最初の解決策については、少し早すぎたようです。少しテストしてさらに読んだ後、アンダースコアは単語の文字であるため、上記のパターンは一致しないことがわかりました。私はこれを思いついたのですが、もっと良い方法はありますか?

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

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

動作しますが、少しずさんなようです。

4

1 に答える 1

16

「単語境界」表現を使用します\b

おそらく、これと同じくらい簡単なことです:

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

参考までに、単語境界式は、単語文字と非単語文字、またはその逆の\bのゼロ幅の一致であり、入力を消費しません。\w[^\w]


アンダースコアと数字の文字は「単語文字」と見なされるためFoo_BarBar_Foo、 、およびFoo123は一致しません。これを修正して、文字以外が「単語の終わり」(入力の開始と終了を含む) と見なされるようにするには、ルックアラウンドを使用します。

(?i)(.*(?<![^a-z]))Foo((?![^a-z]).*)
于 2012-07-28T01:28:16.223 に答える