检查字符串是否包含IP地址

时间:2010-09-08 16:34:00

标签: c# regex

我有一个文件加载到流阅读器中。该文件包含分散的IP地址。在每个IP地址之前和之后,如果有帮助,则为“\”。另外,每行的第一个“\”总是在ip地址之前,在第一行之前没有其他“\”。

我已经知道我应该使用while循环遍历每一行,但我不知道其余的程序:<

例如:

由Stormix.de提供支持\ 93.190.64.150 \ 7777 \ False

Cupserver \ 85.236.100.100 \ 8178 \假

Euro Server \ 217.163.26.20 \ 7778 \ False

在第一个例子中,我需要“93.190.64.150” 在第二个例子中我需要“85.236.100.100” 在第三个例子中,我需要“217.163.26.20”

我真的很难解析/拼接/切割:s

提前致谢

***我要求将IP保留在一个字符串中,bool返回不足以满足我的目的。

3 个答案:

答案 0 :(得分:12)

using System.Text.RegularExpressions;

…

var sourceString = "put your string here";
var match = Regex.Match(sourceString, @"\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b");
if(match.Success) Console.WriteLine(match.Captures[0]);

这将匹配任何IP地址,但也会999.999.999.999。如果您需要更准确,请在此处查看详细信息:http://www.regular-expressions.info/examples.html

该网站有很多很好的信息和正则表达式,这是一种特定于域的语言,在大多数流行的编程语言中用于文本模式匹配。实际上,我认为该网站是由Mastering Regular Expressions的作者组成的。

更新

我修改了上面的代码,以便按照您的要求捕获IP地址(通过在IP地址模式周围添加括号)。现在我们检查以确保使用Success属性匹配,然后您可以使用Captures[0]获取IP地址(因为我们只有一个捕获组,我们知道使用第一个索引, 0)。

答案 1 :(得分:6)

编辑:编辑以考虑“开始和结束时的斜线”部分。

尝试将每一行与正则表达式匹配(全部为一个字符串;为了便于阅读,将其拆分)。

\\(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\

完整样本:

using System;
using System.Text.RegularExpressions;

class Program
{
    private static readonly Regex Pattern = new Regex
        (@"\\(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}" +
         @"(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\");


    static void Main(string[] args)
    {
        Console.WriteLine(ContainsAddress("Bad IP \\400.100.100.100\\ xyz"));
        Console.WriteLine(ContainsAddress("Good IP \\200.255.123.100\\ xyz"));
        Console.WriteLine(ContainsAddress("No IP \\but slashes\\ xyz"));
        Console.WriteLine(ContainsAddress("Long IP \\123.100.100.100.100\\ x"));
    }

    static bool ContainsAddress(string line)
    {
        return Pattern.IsMatch(line);        
    }
}

答案 2 :(得分:1)

看起来,对于每一行,您都在寻找"^.*?\\(?<address>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\\.*$"

要解决这个问题:

^ - 匹配一行的开头,有助于确保您在正确的位置开始匹配。

。*? - 匹配任何字符零次或多次,但尽可能少。

\ - 匹配反斜杠字符。再加上前两个术语,这将使我们得到第一个反斜杠,这样我们就可以捕捉到下一个术语。

(?) - 指定可在匹配中引用的命名字符组。完整匹配的文本将是按照编写方式的整行,但这个命名组将只是您在匹配中寻找的内容。

[0-9] {1,3} - 匹配1到3位数字符的序列。 [0-9]相当于\ d但是我发现当正则表达式中反斜杠的数量较少以及通常在字符串中看到的字符数量更多时,它更容易理解。

。 - 匹配一段时间。

。* - 匹配任何字符零次或多次。用来跳到最后。

$ - 匹配一行的结尾。