根据String的扩展方法实现正则匹配
详细介绍:
其实我很喜欢正则匹配:他们做得很好。 其实他们太棒了,以至于绝大多数程序猿都要用它。
不幸的是,当我需要一个正则匹配时,我也会遇到类似的问题:我基本上忘记了一些应该死的词法..
。如果我每天都要写一个字,我一定会很容易记住他们,但我一年基本上很少写几个字..
在厌倦了一次又一次地查询和学习文本文档后,我计划根据String的扩展方法来实现它们..
环境:
认证、获取、编写大文本,更换或删除给出方式的文本(如电子邮件地址)时,正则匹配非常强大和简单。
为了正确使用正则匹配,你应该:
用于分析的文本。
为了正确使用正则匹配,你应该:
用于分析的文本。
正则匹配分析模块。
正则匹配(文本用于搜索分析)
正则匹配的词法取决于正则匹配分析模块。 在微软的世界里,这个正则匹配模块类就是
System.Text.RegularExpressions.
这里有词法:http://msdn.microsoft.com/en-us/library/az24scfc.aspx
假如你想详细介绍一下正则匹配语法,请阅读本文写的好帖子: http://www.codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial
正则匹配问题:它们有其优缺点:简单而强大的词法特别适合正则匹配模块,但是不适合人们阅读文章。当你不知道他的词法时,你可以花一整天的时间写一个正确的关系,但可能需要很长时间来测试它。
当你不知道他的词法时,你可以花一整天的时间写一个正确的关系,但可能需要很长时间来测试它。让正则匹配达到你的期望是一件事,让它只达到你的期望是另一件事。
念头:
假如你知道SQL,你就知道了 LIKE 运算符。为什么不把这个计算符送到C#?为什么没有一个能解决绝大多数问题?
一般实际操作简单的词法可以通过正则匹配模块来实现?
简化词法
... 代表较低的运算符。这是我自己的目录:
?= 任何操作符
%= 0 或者几个标识符
*= 0 或者几个标识符,但是没有空格符(关键是题目)
#= 任何单个数字 (0-9)
这也是这种简单语法的例子:
一个Guid可以表示为 : ?????????-????-????-????-????????????
一个 email address 有可能是 : *?@?*.?*
一个日期 : ##/##/####
正则匹配的狂热分子已经跳到桌子上了:很明显,最后一个正则匹配不能保证匹配是一个合适的日期,当然是正确的(那种关系可以匹配99/99/9999). 在涉及检验的情况下,它不能在同一水平上发挥作用。实际操作频繁
我们需要正则匹配引擎的实际操作频繁都有哪些呢?1:判断一个单词是否一致的具体方法:
LIKE2:以一种特定的方式找到文字:
Search3:提取特征中的字符串信息内容:
Extract这三个操作符是使用正则表达式引擎的另一种选择Like', 'Search' and 'Extract' String的扩展方法已经完成。
让我们先谈谈他的使用吧...
1. 确定是否有字符串数组。Like” 特定的方式如果你懂SQL,那就懂我说的。...若字符串与指定方法相匹配,Like操作符将简单返回truee.
下面所有的例子都回到了true,这意味着输入的字符串与他匹配。
example:字符串数组是guid。example:字符串数组是guid。
var result = "TA0E02391-A0DF-472-B39A-C11F7D63C95.Like("????????-????-????-????????????");
example:guid末尾的字符串。
var result = "This is a guid TA0E02391-A0DF-472-B39A-C11F7D63C95.Like(" %????????-????-????-????????????");
example:从guid开始的字符串。
var result = "TA0E02391-A0DF-472-B39-C11F7 is a guid".Like("????????-????-????-???????????? %");
example:字符串包括guid
var result = "this string TA0E02391-A0DF-472-B39-C11F7 contains a guid".Like(" %????????-????-????-????????????%");
2. 在字符串中搜索特定的方法
Search扩展方法可以在字符串中找到第一个配对给出方法的签名。
example: 在字符串数组中检索guid
var result = "this string [TA0E02391-A0DF-4772-B39A-C11F7D63C95 contains a string matching".Search("[????????-????-????-????????????]") Console.WriteLine(result); // output: [TA0E02391-A0DF-4772-B39A-C11F7D63C95
3. 以特定的方式‘按特定的方式’Extracting’ 字符串中的签名
其实和Like在一起 搜索一样,只是它的返回不是所有的字符串,而是一个广泛匹配的二维数组。example: 在字符串中返回guid的组成部分
var result = "this string [TA0E02391-A0DF-4772-B39A-C11F7D63C95 contains a string matching".Extract("[?????????-????-????-????????????]"); // result is an array containing each part of the pattern: {TA0E02391, "A0DF", "4772", "B39A", C11F7D63C495}
example: 在字符串中返回email的组成部分
var result = "this string contains an email: toto@domain.com".Extract("*?@?@?*.?*") // result is an array containing each part of the pattern: {"toto", "domain", "com"}
这里是编码:
这个简单的技巧是,这三种公开发布和扩展方法取决于Getregex 将这种简单的关系转化为高效的方法.net 正则匹配。
public static bool Like(this string item, string searchPattern) { return GetRegex("^" searchPattern).IsMatch(item); } public static string Search(this string item, string searchPattern) { var match = GetRegex(searchPattern).Match(item); if (match.Success) { return item.Substring(match.Index, match.Length); } return null; } public static List Extract(this string item, string searchPattern)
{
var result = item.Search(searchPattern);
if (!string.IsNullOrWhiteSpace(result))
{
var splitted = searchPattern.Split(new[] { '?', '%', '*', '#' }, StringSplitOptions.RemoveEmptyEntries);
var temp = result;
var final = new List