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,而剩余的字符串以\nwhich deos 不匹配开头(\r\n)*文档说点().

匹配除 \n 之外的任何单个字符。

为避免这种情况,请尝试使用更准确的模式来匹配部分 IP 地址中的数字,正如Caramiriel在他的回答中所说的那样。

您还可以将模式更改为:

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

哪个更准确匹配换行符。

于 2013-03-13T12:26:51.190 回答