1

文字列を、すべてが始まる規則を持つ正規表現と一致させようとします10.20

string str = @"10.20.30.1\r\n10.20.40.2\r\n10.20.50.3";
string pattern = @"(10\.20.+(\r\n)*)+";

var m = System.Text.RegularExpressions.Regex.Match(str, pattern);

ただし、最初の行のみをキャッチします。つまり、次のようになります。

Console.Write(m.ToString()); // prints 10.20.30.1,

編集: 単一行または複数行がある場合を区別しようとしています。つまり、上記の の例でstr、ユーザーが

string pattern = @"(10\.20.+)+";

それは私が期待する最初の行にのみ一致します。私は何が欠けていますか?

4

2 に答える 2

1

Matchesの代わりに使ってみましたかMatch?複数の一致を探しています:

var matches = System.Text.RegularExpressions.Regex.Matches(
    "10.20.30.1\r\n10.20.40.2\r\n10.20.50.3",
    @"(10\.20.+(\r\n)*)+",
    RegexOptions.Compiled | RegexOptions.CultureInvariant);

Assert.AreEqual(3, matches.Count);

以下のコメントに返信して、すべての一致を として取得するにはstring:

var match = System.Text.RegularExpressions.Regex.Match(
        "foo 10.20.30.1\r\n10.20.40.2\r\n10.20.50.3 bar",
        @"(10\.20\.\d{1,3}\.\d{1,3}(\r\n)*)+",
        RegexOptions.Compiled | RegexOptions.CultureInvariant)
    .ToString();

Regexできるだけ具体的でありながら、すべての条件に一致するを使用することをお勧めします。.は以外のすべてに一致するため\n、 のようなものを考え出す解決策がまだあります@"(10\.20\.([^\r])+(\r\n)*)+"10.20.30.1\r\n10.20.40.2\r\n10.20.50.3 barただし、他の情報が残っている場合は一致します。

于 2013-03-13T12:17:49.373 に答える
1

文字列を逐語的な文字列(文字付き@)として定義しました:

string str = @"10.20.30.1\r\n10.20.40.2\r\n10.20.50.3";

そのため\、エスケープ文字としては機能しません。@文字列定義の先頭から を削除します。

あなたのパターンの問題は、.+in@"(10\.20.+(\r\n)*)+"が を消費し\r、残りの文字列が\ndeos not match で始まること(\r\n)*です。ドキュメントには、ドット ( .):

\n を除く任意の 1 文字に一致します。

それを避けるには、より正確なパターンを使用して、IP アドレスの一部の数字と一致させるようにしてください。Caramirielが回答で述べています。

パターンを次のように変更することもできます。

string pattern = @"(10\.20.+(\r\n?|\n)*)+";

改行文字に一致する方が正確です。

于 2013-03-13T12:26:51.190 に答える