TCL の正規表現に関して、次の正規表現を使用する場合:
regexp "helloworld\[\\s]+.name."
次の出力と一致します。
helloworld (name)
できます。\
しかし、「 」の前に「 」を追加する必要があるのだろうかと思います。]
他の人が作成したコードを見ました。彼らは「]
」を「 」で閉じていませんでした。その\
理由を知りたいです。
1 つの理由は Utkanos が説明したことかもしれませんが、もう 1 つは Tcl 固有の動作によるものかもしれません[
。コマンド置換が許可されている場所では、文字は特別な意味を持ちます。観察:
% proc foo {} { return y }
% puts x[foo]z
xyz
したがって、Tcl で正規表現を扱う場合 (文字どおりに指定しようとするか、実行時に構築するなど)、この正規表現を形成する文字列が Tcl によってどのように処理されるかを考える必要があります。
regexp
これが、ほとんどの場合、正規表現の文字が中括弧を使用してグループ化されたコマンドに{
直接渡されるのを目にする理由です}
。これにより、(ほとんどの) Tcl の置換が抑制されるため、正規表現の仕様を「そのまま」、ほぼその中に記述できます。エスケープなしのプレーンな構文。
しかし、仕様を動的に構築したい場合 (たとえば、そこに変数の内容を埋め込む場合) には、これは明らかにうまく機能しません。通常、人々は二重引用符を使用して正規表現文字をグループ化することに頼っているため、特定の Tcl の置換を防ぐために特別なエスケープを行う必要があります。append
よりクリーンなアプローチは、コマンドを使用してパターンを構築することです。
グループ化の詳細については、こちら、こちら、およびこちらをご覧ください。
インターネットで本を見つけることに関しては、「Mastering Regular Expressions」は、通常、主題に関する本と考えられているものです。
補足として、特定の例では角括弧はまったく必要ありません。正規表現では、「文字範囲」を作成するために使用されます-指定された範囲外の単一の文字に一致するパターン-そしてあなたの場合は範囲入力内の単一の空白文字に一致するように定義された正確に 1 つの (メタ) 文字で構成されます。したがって、この特定のケースでは、パターンhelloworld\s+.name.
は問題なく機能します。
いいえ、[
範囲を定義するなど、特別な意味で使用しているためです。リテラルと一致させたい場合にのみ、バックスラッシュでエスケープします[
。バックスラッシュは、REGEXPで特別な動作を呼び出す文字をエスケープするために使用されます。
(Javascript)
var str = "[hello]";
str.match(/[a-z]+/); //resultant array: ['hello']
str.match(/\[[a-z]+\]/); //resultant array: ['[hello]']
この式はあなたが望むものだと思います:
regexp {helloworld\s+.name.} $the_string
角括弧はまったく必要ありません。