2011-07-14 6 views
0

テキストファイルに、グループに取り込みたい値が入っている文字列があります。テキストファイルの各行/列は、一意のレコードですが、値は通常、各行に所定の形式にこだわる:私はキャプチャグループにキャプチャグループ1にValueAValueWをキャプチャしたい場合は注文に関係なく、文字列内の値をグループに取り込むRegEx?

ValueA ValueD ValueS ValueR ValueW ValueT 
ValueX ValueW ValueB ValueM ValueQ ValueA 

等2、問題の値の各テキスト行の位置に関係なく、適切に処理する単一の正規表現を使用して行うことはできますか?

目標は、キャプチャグループを使用して2つのキャプチャされた値をファイルに書き戻して、注文できるようにすることです。つまり、「ValueW ValueA」です。

答えて

1

次のようなものを使用することができますあなただけのmatchiある場合最後に.*は必要ありません.Verxパターンとの一致度合いによっては、?をすべて削除することができます。

+0

先頭のキャレットを取り除くと、これは完全に機能します!ありがとう! – Kumba

+0

Btw、最も優れたツールである[RegExr](http://gskinner.com/RegExr/)でテストしてください。 – Kumba

+0

'^'を使うべきです。一つの文字列で動作する場合は、 '/ m'の複数行モードを使用していることを確認してください。 – Qtax

0

多分このような何か:ファイルへの出力グループを、その後、正規表現の様々なとのパイプを、最初の改行とスペースを見つけると置き換え、そのUNIXを想定し

(?<ValueA>ValueA)|(?<ValueW>ValueW) 
+0

私はこれを試しました。 ORステートメントは、どちらか一方のみをキャプチャします。両方とも各行に存在しますが、その順序は異なります。私は2つの別々の正規表現のレシピでこれを試すことができます(必要ならばbashスクリプトを書くことができます)。しかし、それがただ1つでか、多分egrepやsed経由でできるかどうか見ていました。 – Kumba

0

これは正規表現の不正使用です - 警官を呼び出してください!

真剣に...これを行う必要がある場合は、各グループでor演算子(|)を使用して2つの単語のどちらかを選択することができます。

^(?=.*?(ValueA))(?=.*?(ValueW)).* 

Perlの例:

$_ = <<'_STR_'; 
ValueA ValueD ValueS ValueR ValueW ValueT 
ValueX ValueW ValueB ValueM ValueQ ValueA 
_STR_ 

s/^(?=.*?(ValueA))(?=.*?(ValueW)).*/$1 $2/gm; 

print; 

出力:

また
ValueA ValueW 
ValueA ValueW 

http://ideone.com/IhGfSで:

+0

BTW - これは正規表現に大きく依存します。正規表現の投稿には常にあなたが意味する種類のタグを付けます。 –

+0

申し訳ありませんが、PCRE正規表現です。タグを調整します。ありがとう! – Kumba

関連する問題