1

私は以下のようにパターンマッチを見つけようとしています abc(xxxx):efg(xxxx):xyz(xxxx)ここでxxxx-[0-9]桁

使用しました

set string "my string is abc(xxxx):efg(xxxx):xyz(xxxx)"
regexp abc(....):efg(....):xyz(....) $string result_str

それは0を返します。誰か助けてもらえますか?

4

2 に答える 2

2

あなたが抱えている問題は、Tcl (およびその他の多くの RE エンジン) の正規表現は、サブ RE をキャプチャすることを示すという点で特別な意味を持っていることです()文字を「通常」にするには、バックスラッシュでエスケープする必要があります。つまり、正規表現を中かっこで囲むのが最善です (バックスラッシュは一般的な Tcl メタ文字であるため)。

したがって:

% set string "my string is abc(xxxx):efg(xxxx):xyz(xxxx)"
% regexp {abc\(....\):efg\(....\):xyz\(....\)} $string
1

これらの括弧の内容も取得したい場合は、もう少し複雑な RE が必要です:

regexp {abc\((....)\):efg\((....)\):xyz\((....)\)} $string \
        all abc_bit efg_bit xyz_bit

これらの....シーケンスは常に正確に 4 文字に一致しますが、より具体的にする方がよいことに注意してください。それぞれの場合に任意の桁数に一致させるには:

regexp {abc\((\d+)\):efg\((\d+)\):xyz\((\d+)\)} $string -> abc efg xyz

を使用regexpして文字列のビットを抽出する場合、文字列->全体の一致の (かなり奇妙な) 変数名として使用するのはかなり一般的です。「抽出されたピースをこれらの変数に送信する」と言っているようにニーモニックに見えます。

于 2012-08-16T09:33:52.747 に答える
0

tcl では動作しませんが、(andをエスケープする必要があるようです)。また、xが数字であることが確実な場合は、\d{4}代わりに を使用して....ください。これに基づいて、試すことができる更新された正規表現は次のとおりです

abc\(\d{4}\):efg\(\d{4}\):xyz\(\d{4}\).

于 2012-08-16T08:59:09.820 に答える