如何检查字符串是否与某种格式匹配?例如,如何检查字符串是否与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
答案 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
字 - 此标头可以使用GET
,POST
,PUT
或DELETE
字。如果您知道所有可能的符号范围,请使用范围块:例如,可以将文字确定为[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