グループを除外する Emacs 正規表現を作成しようとして困惑しています。セット内の個々の文字を除外しますが、特定の文字列[^]
を除外したい: のようなもので、「not」または「this」を含む文字列が一致しないようにします。[^(not|this)]
原則として、私は書くことができます([^n][^o][^t]|[^...])
が、よりクリーンな別の方法はありますか?
グループを除外する Emacs 正規表現を作成しようとして困惑しています。セット内の個々の文字を除外しますが、特定の文字列[^]
を除外したい: のようなもので、「not」または「this」を含む文字列が一致しないようにします。[^(not|this)]
原則として、私は書くことができます([^n][^o][^t]|[^...])
が、よりクリーンな別の方法はありますか?
これは簡単には不可能です。正規表現は物事に一致するように設計されており、これが彼らにできることのすべてです。
まず[^]
、「グループを除外する」を指定するのではなく、否定された文字クラスを指定します。文字クラスは、どのような形式や形でもグループ化をサポートしていません。それらは単一の文字をサポートします(そして、便宜上、文字範囲)。正規表現エンジンに関する限り、試行[^(not|this)]
は100%同等です。[^)(|hinots]
この状況から抜け出すには、次の3つの方法があります。
(not|this)
を除外します(一致結果を否定します)まず第一に:[^n][^o][^t]
解決策ではありません。これにより、 (が一致しない)、 (が一致しない)、nil
(が一致しない)などの単語も除外されます。[^n]
bob
[^o]
cat
[^t]
しかし、どちらも含まない文字列に一致する基本的な構文で正規表現を構築することは可能not
ですthis
:
^([^nt]|n($|[^o]|o($|[^t]))|t($|[^h]|h($|[^i]|i($|[^s]))))*$
この正規表現のパターンは、単語の最初の文字または単語のプレフィックスのみではなく、単語全体ではない任意の文字を許可することです。
(Gumbo からの) 受け入れられた回答が実際に受け入れられたとは信じがたいです! あなたが望むことをすることができないことを示したためにそれが受け入れられた場合を除きます. (Gumbo が示すように) そのような正規表現を生成する関数がない限り、それらを作成するのは本当に面倒です。
本当のユースケースは何ですか - あなたは本当に何をしようとしていますか?
Tomalak が指摘したように、(a) これは正規表現が行うことではありません。(b) 彼がリンクした別の投稿を参照して、問題の対処法などの適切な説明を確認してください。
答えは、正規表現を使用して不要なものに一致させ、それを最初のドメインから差し引くことです。IOW、正規表現に除外を行わせようとしないでください(できません)。正規表現を使用して除外したいものに一致させた後、除外を行います。
これは、正規表現を使用するすべてのツールがどのように機能するか (例grep
: ) です。それらは、減算を実行する別のオプション (例: 構文を介して) を提供します -- 減算する必要があるものを照合した後。
否定的な先読みをしようとしているようです。つまり、区切り文字に到達したら、一致を停止しようとしています。
Emacs は先読みを直接サポートしていませんが、貪欲でないバージョンの *、+、および ? をサポートしています。ほとんどの場合、同じ目的で使用できます。
たとえば、この JavaScript 関数の本体を一致させるには、次のようにします。
bar = function (args) {
if (blah) {
foo();
}
};
次の emacs 正規表現を使用できます。
function ([^)]+) {[[:ascii:]]+?};
ここでは、2 つの要素シーケンス "};" が見つかったら停止します。[[:ascii:]] は、"." の代わりに使用されます。演算子は複数行で機能するためです。
}; であるため、これは否定的な先読みとは少し異なります。シーケンス自体は一致しましたが、その時点までのすべてを抽出することが目標の場合は、キャプチャ グループ \( および \) を使用するだけです。
emacs 正規表現マニュアルを参照してください: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html
補足として、何らかの種類の emacs 正規表現を作成する場合は、必ず Mx リビルダーを呼び出してください。これにより、現在のバッファーに対して正規表現を作成するための小さな IDE が起動します。
Mx フラッシュラインを試してください。
論理テストのために文字列を照合するユースケースでは、次のようにします。
;; Code to match string ends with '-region' but excludes those that has 'mouse'.
M-x ielm RET
*** Welcome to IELM *** Type (describe-mode) for help.
ELISP> (setq str1 "mouse-drag-region" str2 "mou-drag-region" str3 "mou-region-drag")
"mou-region-drag"
ELISP> (and (string-match-p "-region$" str1) (not (string-match-p "mouse" str1)))
nil
ELISP> (and (string-match-p "-region$" str2) (not (string-match-p "mouse" str2)))
t
ELISP> (and (string-match-p "-region$" str3) (not (string-match-p "mouse" str3)))
nil
Over Here で説明した関数のバグを回避するために、このアプローチを使用します。
正規表現を使用してバッファ内のテキストを検索または置換しようとしている場合は、https://github.com/benma/visual-regexp-steroids.el/を使用できます
ビジュアル正規表現ステロイドを使用すると、python 正規表現を使用して置換、検索などを行うことができます。Python 正規表現は、否定先読みと否定先読みをサポートしています。