こんにちは、TCL の初心者です。コードやメソッドについて教えてください。たとえば、(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp) などの文字列があります。
() の間のすべてを削除して、Hi と Hello だけを出力したいだけです
こんにちは、TCL の初心者です。コードやメソッドについて教えてください。たとえば、(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp) などの文字列があります。
() の間のすべてを削除して、Hi と Hello だけを出力したいだけです
Tclregsub
を使用して、括弧で囲まれたものをすべて削除できます。
set x "(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)"
regsub -all {\(.*?\)} $x {} x
puts $x
これにより、次の結果が得られます。
$ tclsh foo.tcl
HELLO HI
私の提案はregsub
、正規表現に基づいて置換を実行するコマンドを使用することです。次のように書くことができます。
set str {(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)}
set result [ regsub -all {\(.*?\)} $str {} ]
-all
パターンがソース文字列に複数回出現する可能性があり、最初のパターンだけを削除したくないため、このオプションが必要です。
中のテキスト{...}
はパターンです。括弧内にあるものは何でも一致させたいので、その\(...\)
部分を使用します。ブラケットは正規表現の構文で特別な意味を持つため、エスケープする必要があります。
括弧内では、ゼロ回以上繰り返される任意の文字に一致させたいので.*?
、 があります。ここで、ドットは任意の文字を意味し、*?
はゼロ回以上の非貪欲な繰り返しコマンドです。
これも正規表現のみを使用する方法です。
set p {(abcgfhdskls12345)HELLO(hikjkflklfk) (bkjopkjjkl)HI(kjkkjjuilpp)}
set pol [regexp {(.*)(HELLO)(.*) (.*)(HI)(.*)} $p p1 p2 p3 p4 p5 p6]
puts "$p3 $p6"
o/p: こんにちはこんにちは