1

私はTCLやTCL正規表現の使用にあまり熟練していません。しかし、行/文が与えられた場合に単語に特殊文字が含まれていることを除外または通知できるTCLメカニズム/正規表現が必要です。

私が以下のような行/文を持っていると仮定します:

 (space)(space)At 4:00:00AM (not sure) please do your work ...

ここで、行を分割して、foreachを使用して各単語をループさせようとします。

% set fields [split "   At 4:00:00AM (not sure) please do your work" " " ]
{} {} {} At 4:00:00AM (not sure) please do your work

しかし、ここでも空のフィールドは必要ありません。

% foreach val $fields {
       puts $val
}



At
4:00:00AM
(not
sure)
please
do
your
work

さらに、次のような特殊文字を含むforeachループ内の単語を除外したいと思います。

(not
sure)
4:00:00AM

単語の開始、終了、または任意の場所に「(」または「:」が含まれる単語を除外します。

どうすればこれを達成できますか。

4

2 に答える 2

1
set str "   At 4:00:00AM (not sure) please do your work"

# split the string into space-delimited words
set words [regexp -inline -all {\S+} $str]

# eliminate words containing a character other than letters, numbers, underscore
set alnum_words [lsearch -inline -regexp -all -not $words {\W}]

alnum_words今リストが含まれています{At please do your work}

文字だけで構成された単語だけが必要な場合は、

lsearch -inline -regexp -all $words {^[[:alpha:]]+$}
于 2012-11-22T14:23:36.237 に答える
0

残念ながら、Tcl正規表現は後読み演算子をサポートしていません。それ以外の場合は、単一の正規表現で実現できます。ただし、次のコードを使用して、必要な単語のリストを作成できます。

set the_line "   At 4:00:00AM (not sure) please do your work"
set fields {}
foreach {- val} [regexp -all -inline -- {(?:^|\s)([^:()\s]+(?=\s|$))} $the_line] {
    lappend fields $val
}
于 2012-11-22T12:59:47.883 に答える