1

1)私の文字列は以下です

% set a {
    absdsdgfg
    dsdgsdg
    sdgsdgsd
    asdas192.168.2.1
    asdfsdf
    sdfsdf
    10.10.10.1
}
absdsdgfg
dsdgsdg
sdgsdgsd
asdas192.168.2.1
asdfsdf
sdfsdf
10.10.10.1

2) 正規表現は

% regexp {.*(\d+\.\d+\.\d+\.\d+).*} $a -> ip
1

3) アウトプット

% set ip
0.10.10.1    
%

ステップ番号-3 では、出力を として取得しています0.10.10.1。なぜ私は1ここにいないのですか?と一致するはずの数字です\dが、なぜ と一致しているのですか(.*)

4

2 に答える 2

4

最初.*は食べること1です。

これが起こらないようにするには、次の遅延バージョンを使用できます.*.*?

背後にある理由は、最初の.*最初の文字列の最後までのすべてに一致し、正規表現によってまだ一致していない他の文字をチェックするために一度に 1 文字戻るためです。

ここで 0 の前のポイントに戻ると0.10.10.1、正規表現の最後の部分が一致し (それ以上戻ることはないことを意味します)、正規表現は一致を返します。

そして、これが、あなたが名前を付けたキャプチャされたグループに入るものですip

ただし、.*?はできるだけ一致せず、 を取得し192.168.2.1ます。を取得したい場合は10.10.10.1、次の正規表現を使用します。

regexp {.*?(\d+\.\d+\.\d+\.\d+)\s*$} $a -> ip

または、短くすることもできます:

regexp {.*?(\d+(?:\.\d+){3})\s*$} $a -> ip

そして実際には、.*?ここでも必要ありません:

regexp {(\d+(?:\.\d+){3})\s*$} $a -> ip
于 2013-09-13T13:04:48.823 に答える
0

文字列セット a { absdsdgfg dsdgsdg sdgsdgsd asdas192.168.2.1 asdfsdf sdfsdf 10.10.10.1 } の場合、正規表現を使用します: % regexp -all {(\d+.\d+.\d+.\d+)} $a ip %puts " $ip" 10.10.10.1

于 2013-10-03T08:15:37.150 に答える