## Tcl9.0.3/Tk9.0.3 Documentation > Tcl Commands > regsub

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

  NAME
    regsub — 正規表現模様合致に基き置換を遂行する Perform substitutions based on regular expression pattern matching
  構文 SYNOPSIS
  説明 DESCRIPTION
    -all
    -command
    -expanded
    -line
    -linestop
    -lineanchor
    -nocase
    -start index
    --
  用例 EXAMPLES
  SEE ALSO
  KEYWORDS

### NAME

regsub — 正規表現模様合致に基き置換を遂行する Perform substitutions based on regular expression pattern matching

### 構文 SYNOPSIS

regsub ?switches? exp string subSpec ?varName?

### 説明 DESCRIPTION

この命令は正規表現 exp を string に対して引合せ､ string を varName で名前を与えられた変数に複写するか､ varName が存在しない場合は string を返す｡(正規表現の合致は正規表現 re_syntax の参照頁に記載されている｡)もし､合致があると､ string から varName に(又は､ varName が存在しない場合はこの命令の結果に)複写している間に､ exp に合致した string の部分が subSpec に置き換えられる｡もし､ subSpec が “&” か “\0” を含んでいると､置換の間に､それが､ exp に合致した string の部分と置換される｡もし､ n が1から9までの数字の場合､ subSpec が “\n” を含んでいると､ exp の n 番目の括弧に括られた部分表現に合致した string の部分と置換される｡ “&” と “\0” と “\n” と逆斜線の特別な解釈を妨げる為に､ subSpec 中に､追加の逆斜線が使用されても好い｡ subSpec 中の逆斜線の使用は､Tcl 構文解析系の逆斜線の使用と拙く相互干渉する傾向がある､そこで､逆斜線を使用する場合は､ subSpec を波括弧で囲むことが一般に安全である｡ 　　　 This command matches the regular expression exp against string, and either copies string to the variable whose name is given by varName or returns string if varName is not present. (Regular expression matching is described in the re_syntax reference page.) If there is a match, then while copying string to varName (or to the result of this command if varName is not present) the portion of string that matched exp is replaced with subSpec. If subSpec contains a “&” or “\0”, then it is replaced in the substitution with the portion of string that matched exp. If subSpec contains a “\n”, where n is a digit between 1 and 9, then it is replaced in the substitution with the portion of string that matched the n'th parenthesized subexpression of exp. Additional backslashes may be used in subSpec to prevent special interpretation of “&”, “\0”, “\n” and backslashes. The use of backslashes in subSpec tends to interact badly with the Tcl parser's use of backslashes, so it is generally safest to enclose subSpec in braces if it includes backslashes.

もし､ regsub に対する最初の引数が､ - で始まっていると､それは切替子として扱われる｡次の切替子が現在運用されている: If the initial arguments to regsub start with - then they are treated as switches. The following switches are currently supported:

-all
  exp に合致する string 内の 全ての範囲が見付けられ､それぞれのこの範囲について置換が遂行される｡この切替子なしでは､僅かに最初の合致範囲のみが見付けられ､置換される｡もし､ -all が指定されていると､ “&” と “\n” の並びが対応する合致からの情報を使ってそれぞれの置換を処理する｡ All ranges in string that match exp are found and substitution is performed for each of these ranges. Without this switch only the first matching range is found and substituted. If -all is specified, then “&” and “\n” sequences are handled for each substitution using the information from the corresponding match.

-command
  subSpec の処理方法を変更し､置換文字列の雛形としては扱わず､且つ文字列 “&” と “\n” はもはや特別な意味を有さない｡代りに､ subSpec は命令前置辞でなければならず､即ち非空のリストである｡その部分文字列がexp に合致し､又､それぞれの部分文字列がそれぞれの exp 内部の捕捉用の部分-正規表現に合致している､文字列がそのリストに追加の要素として追記される(リストに追記される品目は regexp -inline が返すことになるものに似ている)｡完成されたリストは Tcl 命令として評価され､その命令の結果は置換文字列である｡命令評価からの不都合や例外は regsub 命令からの不都合や例外になる｡ Changes the handling of subSpec so that it is not treated as a template for a substitution string and the substrings “&” and “\n” no longer have special meaning. Instead subSpec must be a command prefix, that is, a non-empty list. The substring of string that matches exp, and then each substring that matches each capturing sub-RE within exp are appended as additional elements to that list. (The items appended to the list are much like what regexp -inline would return). The completed list is then evaluated as a Tcl command, and the result of that command is the substitution string. Any error or exception from command evaluation becomes an error or exception from the regsub command.

  もし -all が同時に与えられない場合､命令の呼戻しは､たかだか一回起動される(正確に正規表現が合致するとき)｡もし -all も与えられると､命令の呼戻しは､それぞれの合致の位置で順に起動される｡合致した正確な位置の索引は記述譜に利用できる様にはさせない｡ If -all is not also given, the command callback will be invoked at most once (exactly when the regular expression matches). If -all is given, the command callback will be invoked for each matched location, in sequence. The exact location indices that matched are not made available to the script.

  See EXAMPLES below for illustrative cases.

-expanded
  拡張正規表現の構文の使用を可能にする､ここで､空白と注釈が無視される｡これは埋め込み指示項目の (?x) 指定に等しい(取扱説明書の正規表現参照)｡ 　　　 Enables use of the expanded regular expression syntax where whitespace and comments are ignored. This is the same as specifying the (?x) embedded option (see the re_syntax manual page).

-line
  改行検知合致を可能にする｡無為設定では､改行は完全に普通の文字で特別な意味を持たない｡この旗標を指定すると､ “[^” 角括弧表現と “.” は改行に合致することはなく､ “^” は通常の意味に加えて､どの改行でもその後の空文字列に一致する､そして､ “$” は通常の意味に加えて､どの改行でもその前の空文字列に一致する｡この旗標は､ -linestop と -lineanchor の両方の指定､又は､埋め込み指示項目の(?n) 指定と等価である(取扱説明書の正規表現re_syntax参照)｡ Enables newline-sensitive matching. By default, newline is a completely ordinary character with no special meaning. With this flag, “[^” bracket expressions and “.” never match newline, “^” matches an empty string after any newline in addition to its normal function, and “$” matches an empty string before any newline in addition to its normal function. This flag is equivalent to specifying both -linestop and -lineanchor, or the (?n) embedded option (see the re_syntax manual page).

-linestop
  Changes the behavior of “[^” bracket expressions and “.” so that they stop at newlines. This is the same as specifying the (?p) embedded option (see the re_syntax manual page).

-lineanchor
  “^” と “$” (“ “錨”) の振舞いを､それぞれ行の先頭と末尾に合致する様､変更する｡これは､埋め込み指示項目の (?w) 指定と同一である(取扱説明書の正規表現re_syntax参照)｡ 　　　 Changes the behavior of “^” and “$” (the “anchors”) so they match the beginning and end of a line respectively. This is the same as specifying the (?w) embedded option (see the re_syntax manual page).

-nocase
  string 中の大文字が､exp に対して合致する前に小文字に変換される; しかし､ subSpec により指定された置換は､ 変換されない元の string の形式を使う｡ 　　　　 Upper-case characters in string will be converted to lower-case before matching against exp; however, substitutions specified by subSpec use the original unconverted form of string.

-start index
  正規表現の合致を開始する位置として､文字列に入込む文字位置の偏寄量を指定する｡ index の値は string index の index 引数と同じ方法で解釈される｡この切替子を使用した時､ “^” は行の先頭には合致しなくなり､又 \A は､依然として index での､文字列の開始位置に合致する｡ index は入力文字列の境界に拘束されるようになる｡　　 Specifies a character index offset into the string to start matching the regular expression at. The index value is interpreted in the same manner as the index argument to string index. When using this switch, “^” will not match the beginning of the line, and \A will still match the start of the string at index. index will be constrained to the bounds of the input string.

--
  切替子の末尾を記す｡これに続く引数は先頭文字が -であっても exp として扱う｡ Marks the end of switches. The argument following this one will be treated as exp even if it starts with a -.

もし､ varName が与えられると､この命令は見付けられ置換えられた合致範囲の個数を返す､与えられない場合､置換えられた後方の文字列が返される｡正規表現の解釈の詳細については取扱説明書の regexp の見出しを参照されたい｡ 　　 If varName is supplied, the command returns a count of the number of matching ranges that were found and replaced, otherwise the string after replacement is returned. See the manual entry for regexp for details on the interpretation of regular expressions.

### 用例 EXAMPLES

(変数 string 中の文字列中の)全ての単語の foo の実現値を単独で bar で置換える: 　　　 Replace (in the string in variable string) every instance of foo which is a word by itself with bar:

    regsub -all {\mfoo\M} $string bar string

又は( “基本的正規表現” 構文を使う) 　　　 or (using the “basic regular expression” syntax):

    regsub -all {(?b)\<foo\>} $string bar string

単語 interesting の第１番目の実現値の周りに二重引用符を挿入する､縦え大文字であっても行う　　　 Insert double-quotes around the first instance of the word interesting, however it is capitalized.

    regsub -nocase {\yinteresting\y} $string {"&"} string

全ての非ASCII 且つ Tcl上の意味を有する文字を regsub と subst の組合せ使用により \u 除外書式に変換する｡ Convert all non-ASCII and Tcl-significant characters into \u escape sequences by using regsub and subst in combination:

    # この正規表現は全てが殆ど"bad"な文字級位である
    # This RE is just a character class for almost everything "bad"
    set RE {[][{};#\\\$ \r\t\u0080-\uffff]}

    # 角括弧中のTcl記述譜の断片を置換する
    # We will substitute with a fragment of Tcl script in brackets
    set substitution {[format \\\\u%04x [scan "\\&" %c]]}

    # 置換を適用して､置換-文字列を得る､それは
    # 置換の算出の役目を果たすことになる｡註意
    # 改行は特にstring match により処理される､理由は
    # 逆斜線改行は特別の字並びであるから｡
    # Now we apply the substitution to get a subst-string that
    # will perform the computational parts of the conversion. Note
    # that newline is handled specially through string map since
    # backslash-newline is a special sequence.
    set quoted [subst [string map {\n {\\u000a}} \
            [regsub -all $RE $string $substitution]]]

上記の操作は regsub -command を使ってもでき､大概はもっと速い｡(完全事前-処理済の string map は更に速いが､これと同じ位複雑な変換の為の対応付けの処理の負担は大変大きい｡) The above operation can be done using regsub -command instead, which is often faster. (A full pre-computed string map would be faster still, but the cost of computing the map for a transformation as complex as this can be quite large.)

    # この正規表現は全てが殆ど"bad"な文字級位である
    # This RE is just a character class for everything "bad"
    set RE {[][{};#\\\$\s\u0080-\uffff]}

    # これは､正規表現が上記合致を記述する内容を符号命令化する
    # This encodes what the RE described above matches
    proc encodeChar {ch} {
        # 逆斜線-改行は特別の並びなので､改行が処理される｡
        # newline is handled specially since backslash-newline is a
        # special sequence.
        if {$ch eq "\n"} {
            return "\\u000a"
        }
        # No point in writing this as a one-liner
        scan $ch %c charNumber
        format "\\u%04x" $charNumber
    }

    set quoted [regsub -all -command $RE $string encodeChar]

URL符号化文字列を regsub -command と λ項 と apply 命令を使って復号する｡ Decoding a URL-encoded string using regsub -command, a lambda term and the apply command.

    # 固定化を要する URL-符号化文字列内の並びの一つが合致する､
    #  + を空白に､更に %XX を正しい文字に変換する(譬えば､%7e は ~ になる)
    # Match one of the sequences in a URL-encoded string that needs
    # fixing, converting + to space and %XX to the right character
    # (e.g., %7e becomes ~)
    set RE {(\+)|%([0-9A-Fa-f]{2})}

    # 註意すべきは､ -command は命令前置辞を使う､命令の名前ではない
    # Note that -command uses a command prefix, not a command name
    set decoded [regsub -all -command $RE $string {apply {{- p h} {
        # + は特別扱い; 直接操作する
        # + is a special case; handle directly
        if {$p eq "+"} {
            return " "
        }
        # 十六進から文字に変換
        # convert hex to a char
        scan $h %x charNumber
        format %c $charNumber
    }}}]

-command指示項目は､string totitleの様に命令の範囲を制限するには便利かもしれない: The -command option can also be useful for restricting the range of commands such as string totitle:

    set message "the quIck broWn fOX JUmped oVer the laZy dogS..."
    puts [regsub -all -command {\w+} $message {string totitle}]
    # → The Quick Brown Fox Jumped Over The Lazy Dogs..

### SEE ALSO

regexp, re_syntax, subst, string

### KEYWORDS

match, pattern, quoting, regular expression, substitution
Copyright © 1993 The Regents of the University of California.
Copyright © 1994-1996 Sun Microsystems, Inc.
Copyright © 2000 Scriptics Corporation.