2

Playing around with it in linqpad, I can't seem to get this to work. This is the raw business logic of my concern here. Notice that there is a business requirement:

You have one string provided to regex.Match that will return the first match to compare against the test value. The test value will be input by the user as "12345" or "ABCDE" (a five digit alphanumeric string). If they enter six or more characters, or use invalid characters, those should be stripped to take the rightmost 5 characters.

void Main()
{
  var r = @"^(?:[^\p{L}\\<>~=,-]|[A-Za-z0-9])+$";
  var rg = new Regex(r);
  var test = "J99-291-098";
  var m = "91098";
  rg.Match(test).Dump();

  //(m == rg.Match(test).Captures[0].Value).Dump();
}

What am I doing wrong here? All I want to capture is the J99291098 of the example (and more specifically the 91098 of the test string, but if you can get me to J99291908 I can figure out how to get just five).

I can't change the code to use Regex.Replace, I can't change the code to use more loops. If it's impossible to do this with just a Regex.Match then that's the answer, but I figure this can be done.

4

1 に答える 1

1

いいえ !!、一度にすべてのストリッピングを行うつもりはありません。

あなたがしなければならないことは、関心のある文字を照合し、文字列に追加してから
、最後の5文字の文字列をトリミングすることです.

より多くのループで何を意味するのかわかりません。Matchorを使用Matchesすると、ループが発生します。
Match は最初の一致を取得して停止します。試合がなくなるまで次の試合をしなければなりません。
Matches は 1 回の呼び出しですべての一致を取得しますが、MatchCollection を反復処理する必要があります。

それが役立つ場合は、ここにいくつかのコードがあります。

        string input = "J99-291-098";
        string output = "";

        Regex rxTest = new Regex( @"([A-Za-z0-9]+)" );
        MatchCollection All_matches = rxTest.Matches( input );
        foreach (Match match in All_matches)
            output += match.Groups[1].Value;

        int nn; 
        if ( (nn=output.Length) > 0)
        {
            nn -= 5;
            nn = nn > 0 ? nn : 0;
            Console.WriteLine("Matched  {0}", output.Substring( nn ) );
        }

        return;

 // Output:  Matched  91098

編集 別のアプローチ:

単一の一致を使用して、興味のあるキャラクターだけを取得する方法を次に示します。

  Regex rxTest = new Regex(@"^(?:[^A-Za-z0-9]*([A-Za-z0-9]+))*[^A-Za-z0-9]*$");
  CaptureCollection cc1 = rxTest.Match(input).Groups[1].Captures;

どのようにデータを取得するかはあなたcc1次第です。

于 2013-11-14T22:39:05.567 に答える