匹配每行多个IP地址

时间:2013-03-13 12:09:28

标签: c# regex

我尝试将字符串与正则表达式匹配,该正则表达式的规则始于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.+)+";

它只匹配第一行,我期待。 我错过了什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您将字符串定义为逐字字符串(带@字符):

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

所以\不能用作转义字符。从字符串定义的开头删除@

您的模式存在的问题是,.+中的@"(10\.20.+(\r\n)*)+"将使用\r,其余字符串将以\n开头,其中(\r\n)*.不匹配。 documentation表示点(string pattern = @"(10\.20.+(\r\n?|\n)*)+"; ):

  

匹配除\ n。

之外的任何单个字符

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

您还可以将模式更改为:

{{1}}

更准确地匹配换行符。