2017-06-22 10 views
0

foreachループに3種類のエントリ「10576.53012.46344.35174」、「10」と「Doc-15」があります。この3つのエントリのうち、私は10576.53012.46344.35174がほしいと思う。現在の文字列に複数の文字列が含まれていることを確認する方法と数字。入力文字列にTCLの数字(0-9)と複数(特殊文字)が含まれていることを確認するには

TCLに新しいイムは、これは正規表現のためのかなり良いフィット感で、タスクの一種である提案

答えて

0

が必要です。 5 - - または.を次のグループの数は、グループごとの桁数で、より柔軟に、例えば(少し厳しい何かをしたいかもしれませんが^\d{5}(?:\.\d{5}){3}$ - :

文字列10576.53012.46344.35174は、このようなREにマッチしています3)。

文字列が regexpのコマンドを使用して、正規表現一致する場合

あなたのテスト:各グループは、あなたが望むものであることを

if {[regexp {^\d{5}(?:\.\d{5}){3}$} $theVarWithTheString]} { 
    puts "the regular expression matched $theVarWithTheString" 
} 

別のアプローチが.によって文字列がsplitに、チェックを:

set goodBits 0 
set badString 0 
foreach group [split $theVarWithTheString "."] { 
    if {![string is integer -strict $group]} { 
     set badString 1 
     break 
    } 
    incr goodBits 
} 
if {!$badString && $goodBits == 4} { 
    puts "the string was OK" 
} 

自分で正規表現の方法を好む(場合によってはstring isの助けを借りて)。 RE以外のバリデータを書くことは難しいことがあり、多くのコードを必要とする傾向があります。

+0

ありがとうDonal、regexでの作業は、正規表現内の "(?:\。\ d {5}){3} $"は3回を意味します。 5桁のグループの後に発生? –

+0

はい。つまり、セパレータ( '.')と5桁の3つのロットを探したいということです。もちろん5桁のグループがあります。私は '(?:...)'を使用しています。それは非捕捉グループなので、REをより速くマッチさせることができます。 –

関連する問題