0

2つの形式の多数を含むデータフィールドがあります。

553000.468...705.46.0000000        <- Format 1
553000.469.5501000.704.47.0000000  <- Format 2

703、704、または705を含む中央の3桁だけが必要です

次のような正規表現を使用して、これらの数字を引き出すことができました。

Regex num = new Regex(@"(?<number>7\d+) ?");
Match number = num.Match(numb);
if (number.Success)
    Console.WriteLine(num.Match(numb).Result("${number}")); 

ただし、これは、中央の数字の前に7がない場合にのみ機能します

それにアプローチする最良の方法は、「。」に焦点を当てることだと私には思えます。問題は、「。」の後に文字を一致させる方法がわからないことです。最初の「。」の前の数字を引くことができます。これを行うことによって:

Regex num = new Regex(@"(?<number>.\d+) ?");
Match number = num.Match(numb);
if (number.Success)
    Console.WriteLine(num.Match(numb).Result("${number}")); 

これは私に期間の前にすべてを与えるでしょう。ここにあるチートシートを使用していますが、「。」の後の文字を一致させる方法が示されていません。それを行う方法を理解できれば、必要な番号に到達するまでパターンを繰り返すことができます。その後、上記のコードを使用して、後で番号を取り除くことができます。これは最も効果的な方法ではないかもしれませんが、これまで正規表現を使用したことはなく、正直なところ、非常に紛らわしいと思います。

編集:

もっと多くの例を提供するか、もっとよく説明する必要があると言われました。Glsecという列を持つデータベーステーブルがあります。このフィールドには、2つの形式の数値が含まれます。553000.468 ... 705.46.0000000と553000.469.5501000.704.47.0000000は、2つの形式の例です。

553000.468 ... 705.46.0000000形式では、...(左から14番目の文字)の後の最初の数字のグループにある703、704、または705の数字のみが必要です。

553000.469.5501000.704.47.0000000形式では、左から4番目の数字のグループ(20番目の文字)で見つかった703、704、または705の数字のみが必要です。

その3つのグループの番号には、000から999までの任意の番号を含めることができますが、必要なのは3つの番号だけです。703、704、705が他の番号のグループにランダムにポップアップする可能性もあるため、正しい位置から番号を取得していることを確認する必要があります。

それがそれをよりよく説明することを願っています。

4

7 に答える 7

5

?でSplit()メソッドを使用し.ます 次に、常に同じ位置にある場合は必要な番号を取得できます。または、配列をループして必要な番号を見つけることができます。

于 2012-06-14T15:28:49.820 に答える
3

703、704、または705を含む中央の3桁だけが必要です

あなたはこれを使うことができます:

@"\.(70[3-5])\."

それらが唯一の有効な値である場合。

ところで、誰regexがあなたの問題に取り組むための最良の方法だと言いましたか?

于 2012-06-14T15:25:13.877 に答える
2

String.Contains3つのケースをテストするために使用します。文字列が変数であると仮定しますs

s.Contains(".705.")
s.Contains(".706.")
s.Contains(".707.")
于 2012-06-14T15:36:55.913 に答える
1

2つのステップでやってみませんか。まず、3桁の間にある2つのピリオドを見つけます。次に、期間をトリミングします。

Regex num = new Regex(@"\.\d{3}\.");
Match number = num.Match(numb);
if (number.Success)
    Console.WriteLine(number.Value.Trim('.')); 

一致のサブセットをキャプチャすることもできます。

Regex num = new Regex(@"\.(\d{3})\.");
Match number = num.Match(numb);
if (number.Success)
    Console.WriteLine(number.Groups[1].Value); 
于 2012-06-14T15:29:18.697 に答える
1

。は正規表現のメタ文字であるため、エスケープする必要があります。7で始まる数字は常に3桁ですか?

次のことを試すことができます。

   Regex num = new Regex(@"(?\.<number>\d+) ?");
   Match number = num.Match(numb);
   if (number.Success)
        Console.WriteLine(num.Match(numb).Result("${number}")); 
于 2012-06-14T15:29:46.403 に答える
1

正規表現の「任意の文字」\.を意味するように、ピリオドをエスケープする必要があります。.

必要な数の前に、特定の数のオプションの数+ピリオドを一致させることができます。

Regex num = new Regex(@"^(?:\d*\.){3}(?<number>\d+)");

または後:

Regex num = new Regex(@"(?<number>\d+)(?:\.\d*){2}$");
于 2012-06-14T15:31:52.117 に答える
1

正規表現に飽きたら…。

    string[] formats = new[] {"553000.468...705.46.0000000", "553000.469.5501000.704.47.0000000"};
    var results = from format in formats
                  from sub in format.Split('.')
                  where new[] { "703","704","705" }.Contains(sub)
                  select sub;
于 2012-06-14T15:48:09.517 に答える