我尝试将字符串与正则表达式匹配,该正则表达式的规则始于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.+)+";
它只匹配第一行,我期待。 我错过了什么?
答案 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}}
更准确地匹配换行符。