Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 每行匹配多个IP地址_C#_Regex - Fatal编程技术网

C# 每行匹配多个IP地址

C# 每行匹配多个IP地址,c#,regex,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()); // print

我尝试将字符串与正则表达式匹配,正则表达式的规则是它们都以
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,
编辑:我尝试区分单行或多行的情况。i、 e.在上面的
str
示例中,如果用户给出

string pattern = @"(10\.20.+)+";
它只匹配我期望的第一行。
我缺少什么?

您是否尝试过使用
匹配
而不是
匹配
。您正在查找多个匹配项:

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);
作为对下面评论的回复,要将所有匹配项作为
字符串

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条
,如果您还有其他相关信息。

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

因此,
\
将不能用作转义字符。从字符串定义的开头删除
@

您的模式的问题是
@“(10\.20.+(\r\n)*)+“
中的
+
将使用
\r
,而剩余字符串以
\n
开头,这与
(\r\n)*
不匹配。上面说点(
):

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

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

您还可以将图案更改为:

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

匹配新行字符时,哪个更准确。

我正在尝试获取整个字符串,而不是单行。对我来说,您的代码是正确的:m.toString()=
“10.20.30.1\r\n10.20.40.2\r\n10.20.50.3”
。再次运行您刚刚发布的代码。“如果用户给出…”是用户给出了IP地址还是模式?正如我在回答中所说,问题是:
匹配除\n之外的任何单个字符。不过,我想您忘记了,当
\n
无法匹配时,正则表达式引擎将返回。使用
+
并不是问题所在;这是您提到的通过
@
\r\n
进行的文字转义。@KennethK。我想不是。尝试不带oud
@
的正则表达式,您会发现它只匹配第一个IP。我用简单的字符串尝试了其他组合,这就是我得到的结果。请尝试
Regex.Match(“tall\r\ntill”,“t.+(\r\n)*)+”
,匹配的长度为5(
tall\r
)。@MD.Unicorn,Kenneth正在谈论目标字符串(
str
)。正则表达式字符串可以是任意一种方式:
“\n”
被C#编译器转换为与文本换行符匹配的换行符
@“\n”
保留两个字符的序列
\n
,正则表达式编译器将其识别为换行符序列。
string pattern = @"(10\.20.+(\r\n?|\n)*)+";