如何确保字符串匹配某种格式?

时间:2011-01-29 22:15:52

标签: c# regex

如何检查字符串是否与某种格式匹配?例如,如何检查字符串是否与IP地址,代理地址(或任何自定义格式)的格式匹配?

我找到了这段代码,但我无法理解它的作用。请帮助我理解匹配字符串创建过程。

string pattern = @"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.
    ([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$";
            //create our Regular Expression object

4 个答案:

答案 0 :(得分:13)

正则表达式匹配变得简单:

Regex r = new Regex(@"your_regexp");

if (r.Match(whatever).Success)
{
  // Do_something
}

如果whatever字符串与you_regexp正则表达式匹配,此代码将调用某些操作。

那么它们是什么,这些正则表达式(与正则表达式 regexp 缩写相同)?它们只是字符串模式,旨在用作其他字符串的过滤器。

假设您有很多HTTP标头,并且只想获得GET moofoo HTTP/1.1。您可以使用string.Contains(other_string)方法,但正则表达式使此过程更加详细,无错误,灵活且方便。

Regexp由块组成,可以在将来用于替换。每个块定义整个字符串在某个位置可以包含的符号。块允许您定义这些符号或使用模式来简化您的工作。

可能是或可能不在当前字符串位置的符号如下确定:

  • 如果你确定这些符号必须在那里,只需“按原样”使用它们。在我们的示例中,这与HTTP字匹配 - 这始终存在于HTTP标头中。
  • 如果您知道所有可能的变体,请使用|(逻辑OR)运算符。 注意:所有变种必须用方框符号括起来 - 圆括号。请阅读以下详细信息。在我们的情况下,这个字符匹配GET字 - 此标头可以使用GETPOSTPUTDELETE字。
  • 如果您知道所有可能的符号范围,请使用范围块:例如,可以将文字确定为[a-z][\w][[:alpha:]]方括号范围块的标志。 必须 count 运算符一起使用。这个用于定义重复。例如。如果您的字词/符号应匹配一次或多次,则应使用以下内容进行定义:

    • ?(意思是'可能存在,可能不存在')
    • +(代表'一次或多次')
    • *(代表'零或更多')
    • {A,}(代表'A或更多')
    • {A,B}(表示'不小于A且不大于B次')
    • {,B}(代表'不超过B')
  • 如果您知道哪些符号范围不得出现,请在最开始的范围内使用NOT运算符(^):{{1} } [^a-z]132==?匹配[^\d]匹配abc==? \d定义所有数字,等于[0-9][[:digit:]])。 注意: ^也用于确定整个字符串的最开头,如果它未在范围块中使用:^moo匹配moofoo而不是{{1 }}。要完成此提示,foomoo会匹配整个字符串的结尾:$将与moo$匹配,而不是foomoo

  • 如果您不关心要匹配的符号,请使用星号:moofoo是最常用的模式,可以匹配任意数量的符号。

    注意:所有块都应该用圆括号括起来(.*是一个很好的块示例。)

    注意:所有非标准和保留符号(例如标签符号(phrase),圆括号\t(等)都应该转义(例如,在符号表示之前使用反斜杠:)\(\t,)如果它们不属于任何块并且应按原样匹配。例如,在我们的案例中,\.块中有两个转义序列:HTTP/1.1\/。这两个应按原样匹配。

    在我输入近30分钟之前使用所有文本,让我们使用它并创建一个正则表达式以匹配我们的示例HTTP标头:

  • \.将匹配HTTP方法

  • (GET|POST|PUT|DELETE)将匹配\符号(HTTP规范中定义的空格)
  • <SP>只会帮助我们计算HTTP请求
  • HTTP\/将匹配HTTP版本(仅与(\d+\.\d+)不匹配,但1.1也匹配)
  • 12.34^将是我们的字符串border-limiters

将所有这些陈述集中在一起将为我们提供此正则表达式:$

答案 1 :(得分:2)

正则表达式是您用于对字符串执行查找的内容。定义了一个模式,您可以使用此模式计算表达式的匹配项。这是最好的例子。

以下是我去年编写的一组示例代码,用于检查输入的字符串是否为Hz,KHz,MHz,GHz或THz的有效频率。

理解正则表达式将来自反复试验。在此处阅读正则表达式文档 - http://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.80).aspx 由于误解了某些术语的含义,以及我需要括号等等,下面的表达式花了我大约6个小时的时间才开始工作。但是一旦我有了这个,那么另外6个非常简单。

/// <summary>
    /// Checks the given string against a regular expression to see
    /// if it is a valid hertz measurement, which can be used
    /// by this formatter.
    /// </summary>
    /// <param name="value">The string value to be tested</param>
    /// <returns>Returns true, if it is a valid hertz value</returns>
private Boolean IsValidValue(String value)
{
    //Regular Expression Explaination
    //
    //Start                                                                     (^)
    //Negitive numbers allowed                                                  (-?)
    //At least 1 digit                                                          (\d+)
    //Optional (. followed by at least 1 digit)                                 ((\.\d+)?)
    //Optional (optional whitespace + (any number of characters                 (\s?(([h].*)?([k].*)?([m].*)?([g].*)?([t].*)?)+)?
    //  of which must contain atleast one of the following letters (h,k,m,g,t))
    //  before the remainder of the string.
    //End                                                                       ($)

    String expression = @"^-?\d+(\.\d+)?(\s?(([h].*)?([k].*)?([m].*)?([g].*)?([t].*)?)+)?$";

    return Regex.IsMatch(value, expression, RegexOptions.IgnoreCase);
}

答案 2 :(得分:1)

我建议您阅读regex维基页面。

答案 3 :(得分:1)

看起来您正在寻找支持带端口号的IP地址的正则表达式。这个帖子可能很有用;详细讨论了具有端口号的IP,并给出了一些示例:

http://www.codeproject.com/Messages/2829242/Re-Using-Regex-in-Csharp-for-ip-port-format.aspx

请记住,结构有效的IP与只有有效数字的完全有效的IP不同。例如,999.999.999.999.:0000具有有效的结构,但它不是有效的IP地址。

或者,IPAddress.TryParse()可能适合您,但我自己没有尝试过。

http://msdn.microsoft.com/en-us/library/system.net.ipaddress.tryparse.aspx