1

假设最大 IP 可以在每个“点”括号中包含最大数量 999,即 999.999.999.999 是最大可用的。
我检查了计算器中的正则表达式 ([0-9]+.){3}[0-9]。那么,为什么程序会抛出运行时错误“parsing”?([0-9]+。){3}[0-9]” - 量词 {x,y} 无所事事。”?

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace RegExCs
{
    class Program
    {
        static void Main(string[] args)
        {
            string rawData;
            Regex filter = new Regex(@"?<ip>([0-9]+\.){3}[0-9]"); //run-time error 

            rawData=File.ReadAllText("Query list");

            MatchCollection theMatches = filter.Matches(rawData);

            foreach (Match theMatch in theMatches)
            {
                Console.WriteLine("ip: {0}\n",theMatch.Groups["ip"]);
            }


            Console.ReadKey();

        }
    }
}

官方帮助页面对我没有太大帮助。

“查询列表”文件内容:

来自 212.77.100.101 www.wp.pl 的回复时间:21:37
来自 111.41.130.55 www.dupa.pl 的回复时间:05:33
230.77.100.101 www.whatanannoyingbug.com 回复时间:04:12
来自 65.77.100.101 www.foooo.org 的回复时间:12:55
来自 200.77.100.101 www.example.com 的回复时间:07:56
4

2 回答 2

4

您需要用括号将整个正则表达式括起来,更改?<ip>([0-9]+\.){3}[0-9]为以下内容:

(?<ip>([0-9]+\.){3}[0-9])

这是必要的,因为?<name>创建命名组的语法仅在左括号后立即起作用,否则?意味着“使前一个元素可选”。由于 之前没有先前的元素?,因此您会收到错误消息。

于 2012-06-05T22:42:58.613 回答
1

我会用它来确保它是一个真实的(0-255)IP地址:

(([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))
于 2012-06-05T22:43:45.153 回答