2009-03-18 19 views
2

ユーザーが複数のコンピュータに文字列を挿入しているとします。文字列から部分文字列をRegexで抽出する

1つのコンピュータでは、構成内のパターンによってその文字列の一部の文字が抽出され、4〜5の位置になります。 別のコンピュータでは、抽出パターンは文字列の最後の3桁。

これらの設定(正規表現パターン)はコンピュータごとに異なり、管理者がソースコードを変更することなく変更できるようにする必要があります。

いくつかの例:

  Original_String  Return_Value 
User1 - abcd78defg123   78 
User2 - abcd78defg123   78g1 
User3 - mm127788abcd   12 
User4 - 123456pp12asd   ppsd 

は、それが正規表現で行うことができますか?おかげさまで

+0

お試しいただいた内容について他にもいくつかお答えください。長さと形式が変わるか、それとも常に4文字、2数字、4文字、3数字ですか? –

答えて

1

)を、それがかもしれない正規表現コンパイラに依存(こと)やMicrosoft MSVCのために私はそれが[]

User4 - 123456pp12asd   ppsd 
だと思います

ここでは2つの別々のキャプチャエリアがある点で最も興味深いです。それらを一緒に結合する方法に関するいくつかのデフォルトルールがありますか、または結果をどのように作成するかを指定できるようにしたいですか?

は、おそらくあなたは、キャプチャを取得し、それらを自分で処理するための正規表現を実行するために

r/......(..)...(..)/\1\2/ for ppsd 
r/......(..)...(..)/\2-\1/ for sd-pp 

ような何かをしたいですか、またはあなたは、より高度な操作コマンドを実行したいですか?

+0

これは私が探していたものです! C#では、結果を返す方法を指定することはできないと思いますが、このパターンを適用することができます^ ......(..)...(..)$そしてその場合は処理する必要がありますそれぞれのmatch.Group [x]は自分自身です。どうもありがとう! –

+0

ねえ、でもC#ですべてのマッチを処理する方法がわかっているなら、教えてください! –

7

なぜこれのためにregexを使いたいのですか?何が問題である:

string foo = s.Substring(4,2); 
string bar = s.Substring(s.Length-3,3); 

(あなたは簡単に十分な長さに、境界チェックのビットを行うために、それらを包むことができます)

あなたが本当にしたい場合は、にFunc<string,string>でそれを包むことができでも、私は気にしていませんか?:

Func<string, string> get4and5 = s => s.Substring(4, 2); 
Func<string,string> getLast3 = s => s.Substring(s.Length - 3, 3); 
string value = "abcd78defg123"; 
string foo = getLast3(value); 
string bar = get4and5(value); 
+0

私は自分自身を説明しませんでした。そのために残念。私はこれらのパターンをすべて特定のケースに当てはまるテーブルに入れたいと思っています。 –

+0

私はあなたが上記の[4,2]と[-3,3]を表現するための単純な構文を考えることができると確信しています(ここで - は "右から"を意味します) –

+0

再コンパイルする。 –

1

私はあなたがRegExを使って得ることを望んでいるか分かりません。 RegExはパターンマッチングに使用されます。位置に基づいて抽出する場合は、部分文字列を使用します。

1

Regexは本当に解決策ではないようです。

string section = str.Substring(pos, length) 
1

グループ:位置にposの(0から始まる)の始まる文字列の長さと長さのセクションを返すために、あなたは、単にようなSUBSTRING関数を呼び出します。あなたは/^.{3}(.{{2})/でマッチし、グループ$ 1を見てみることができます。

質問はなぜですか?通常の文字列処理、すなわち実際の部分文字列のメソッドは、意図的により速く、より明確になるでしょう。

3

あなたが本当に正規表現を使用する場合:

^...(..) 

そして:(あなたが通常使用し、さらに使用するための正規表現のキャプチャ値を持っているために

.*(...)$ 
+0

。*は不要です。最後の3文字の前に何かを見る必要があります。 – Tomalak

+0

これは不要ですが、バックトラッキングを減らします。これで、最初の式( '。*')が文字列全体に展開され、最後の3文字だけがバックトラックされ、式全体が一致します。それ以外の場合は、終わりに達すると各文字をチェックします。 – Gumbo

+0

あなたの答えは私が達成したいと思っている結果の一部です。ありがとう。 –

関連する問題