15

Mx replace-regexpを使用して、emacs(たとえばfoo)で出現するすべての単語を置き換えようとしています。

問題は、word_foo_wordなどの強調された単語で発生するfooを置き換えたくないということです。

\ bfoo \ bを使用してfooと一致させると、下線付きの文字列と一致します。私が理解しているように、emacsはアンダースコアを単語の境界の一部と見なしているためです。これはPerlなどの他の正規表現システムとは異なります。

続行する正しい方法は何でしょうか?

4

2 に答える 2

12

正規表現\<foo\>orは、単語の構成文字 (構文 code、通常は英数字であるため、 inではなく inに一致します) が前後にない場合にのみ\bfoo\b一致します。foo wfoo_barfoo1

Emacs 22 以降、正規表現は、シンボル構成文字が前後にない場合にのみ\_<foo_bar\_>一致します。foo_bar記号の構成要素には、単語の構成要素 (英数字) だけでなく、識別子で許可されている句読点文字 (ほとんどのプログラミング言語でアンダースコアを意味する) も含まれます。

于 2011-05-09T19:21:29.963 に答える
5

あなたが書いた:

私が理解しているように、emacsはアンダースコアを単語境界の一部と見なします。これは他の正規表現システムとは異なります

emacs の他のすべてと同様に、アンダースコアの処理は構成可能です。この質問:
前方単語、後方単語を作成し、アンダースコアを単語の一部として扱うにはどうすればよいですか?

...逆に尋ねます。

構文テーブルのアンダースコアの構文を単語の一部にならないように変更し、検索/置換を行うことで問題を解決できると思います。

そのためには、使用しているモードと、そのモードの構文テーブルの名前を知る必要があります。C++ では、次のようになります。

(modify-syntax-entry ?_ "." c++-mode-syntax-table)

ドットは「句読点」を意味し、単語の一部ではないことを意味します。詳細については、試着M-x describe-functionしてくださいmodify-syntax-entry

于 2011-05-09T12:16:11.737 に答える