3

正規表現の問題を理解するのに苦労しています。

2 つの数字、次にハイフンまたはスペース、次に 6 つの数字を探しています。数字は 6 つだけである必要があるため、6 つの数字の後にアルファベット文字、句読点、またはスペースを入れるか、6つの数字を文字列の末尾に配置する必要があります。

他の数値は、それらが分離されている限り、文字列の他の場所で使用できます。

したがって、これらは一致する必要があります。

foo 12-123456 bar  
12-123456 bar  
foo 12-123456  
foo12-123456bar  
12-123456bar  
foo12-123456  
12-123456bar 99
foo12-123456 99 

これらは一致しないはずです:

123-12345 bar  
foo 12-1234567  
123-12345bar  
foo12-1234567  

使用していたものは次のとおりです。

\D\d{2}[-|/\ ]\d{6}\D

Expressoではこれで問題ありませんでした。

しかし、.net アプリケーションで実際に実行すると、このパターンは、6 つの数字が文字列の末尾にある例では一致しませんでした。

これを試しました:

\D\d{2}[-|/\ ]\d{6}[\D|$]

そしてそれはまだ一致していません

foo 12-123456
4

3 に答える 3

4

私はあなたのパターンを言い直します

数字は 6 つだけである必要があるため、6 つの数字の後にアルファベット文字、句読点、またはスペースを入れるか、6 つの数字を文字列の末尾に配置する必要があります。

数字は 6 つだけにする必要があるため、6 番目の数字の後に数字があってはなりません

そして、否定先読みアサーションを使用してこれを表現します。同様に、パターンの開始時に、負の後読みアサーションを使用して、最初の 2 桁の前にあるものはすべて数字ではないことを示します。一緒:

var regex = new Regex(@"(?<!\d)\d{2}[- ]\d{6}(?!\d)");

var testCases = new[]
                    {
                        "foo 12-123456 bar",
                        "12-123456 bar",
                        "foo 12-123456",
                        "foo12-123456bar",
                        "12-123456bar",
                        "foo12-123456",
                        "123-12345 bar",
                        "foo 12-1234567",
                        "123-12345bar",
                        "foo12-1234567",
                    };

foreach (var testCase in testCases)
{
    Console.WriteLine("{0} {1}", regex.IsMatch(testCase), testCase);
}

これにより、必要に応じて 6True秒、次に 4False秒が生成されます。

アサーション(?<!\d)(?!\d)はそれぞれ、「この直前に数字はありません」と「この直後に数字はありません」と言っています。

于 2012-05-30T10:51:58.493 に答える
1

これはそれを行う必要があります:

(^|\D)\d{2}[- ]\d{6}($|\D)

行の先頭または数字以外のいずれかを探し、次に 2-6 または 2 6 のいずれかの言及されたパターンを探し、次に行の終わりまたは別の数字以外のいずれかを探します。

perl で編集およびテストされ、次の 4 ではなく最初の 8 に一致します。

C# には、RegEx の他の仕様がある場合があります。変更が必要かどうか、またはどの変更が必要かはわかりません。

于 2012-05-30T11:01:23.527 に答える
0

OK、さらに編集した質問に基づいて、答えは次のように^(?:.*?\D+?)?(\d{2}[-|/\ ]\d{6})(?:\D+?.*?)?$なります。すべての文字列に一致し、数字をキャプチャします。

upd : マッチングをテストするためのコードを追加しました。

MessageBox.Show(Regex.Replace(
  "1 foo 12-123456 bar\r\n12-123456 bar\r\nfo23o 12-123456\r\nfoo12-123456bar3\r\n" +
  "12-123456bar\r\nfoo12-123456\r\n\r\nThese should not match:\r\n\r\n" +
  "123-12345 bar\r\nfoo 12-1234567\r\n123-12345bar\r\nfoo12-1234567",
  @"^(?:.*?\D+?)?(\d{2}[-|/\ ]\d{6})(?:\D+?.*?)?$",
  @"[match, cap: '$1']",
  RegexOptions.Multiline
));
于 2012-05-30T10:40:10.883 に答える