0

次の出力があります。

Player name: RON_98
Player name: RON_97
player name: RON_96

RON 部分とその後のデジタル部分 (たとえば 98) を取得する必要があります。次の正規表現を使用しました: regexp "(RON)_(\[0-9]*)",これは最後の行の RON_96 と一致しますか? "*"貪欲な一致ですが、出力の最初の行だけを一致させる方法は? (RON)_(デジタルのみ一致) のようなものはありますか? 行の残りの部分と一致するのを防ぐことができますか?

4

2 に答える 2

0

複数の行に一致するように指定した正規表現を選択したとしても、最初に指定した行以外は一致しません。これは「RON_98」です。最初の一致の最後の桁の後に停止します。RegEx の末尾に $ を使用して、行を読み取った後に強制的に停止することもできます (行末に一致します)。

参考までに、[0-9] は \d (数字) のように簡単に記述できます。

(RON)_\d*

読みやすくなっています。

于 2012-06-26T09:26:57.947 に答える
0

Tcl では常に正規表現を中かっこで囲みます。

技術的には必要ありません (Tcl の言語定義を使用して、他の方法でバックスラッシュが必要になるかを正確に判断できます) が、通常遭遇する可能性が高いすべてのケースでより簡単です。

以下の例ではこれを使用します。


正規表現は、できるだけ早く一致を開始します。次に、通常の (貪欲な) 状況では、できるだけ多くのテキストに一致します。したがって、サンプル コードとテキストを使用して、マッチャーはR最初の行の で照合を開始し、 まで消費し続けます。8この時点で、 が一致して停止します。regexp一致した部分文字列ではなく、一致した文字列のインデックスを報告するように依頼することで、これを確認できます (-indicesオプションを介して、マニュアル ページに記載されています)。

文字列内のすべての一致を取得するには、次の 2 つのオプションがあります。

  1. -all -inlineにオプションを渡し、regexp結果のリストを次のように処理しforeachます。

    # Three variables in foreach; one for whole match, one for each substring
    foreach {a b c} [regexp -all -inline {(RON)_([0-9]*)} $thedata] {
        puts "matched '$a', with b=$b and c=$c"
    }
    
  2. -indicesオプションをオプションと一緒に使用して-start、すべてwhileループ内で、文字列をステップ実行します。

    set idx 0
    while {[regexp -start $idx -indices {(RON)_([0-9]*)} $thedata a b c]} {
        puts "matched at '$a', with subranges '$b' and '$c'"
        set extracted [string range $thedata {*}$c]
        puts "the extracted value is '$extracted'"
    
        # Advance the place where the next search will start from
        set idx [expr {[lindex $a 1] + 1}]
    }
    

通常、最初のオプションを使用することをお勧めします。はるかに使いやすいです!より多くの情報を提供し、使用する中間ストレージが少ないため、2 番目の方が優れている場合もありますが、正しく理解するのははるかに難しいことでもあります。

于 2012-06-26T13:26:14.257 に答える