新物网

当前位置:首页 > 百科

百科

根据String的扩展方法实现正则匹配

时间:2023-10-15 19:58:14 静子
详细介绍:其实我很喜欢正则匹配:他们做得很好。 其实他们太棒了,以至于绝大多数程序猿都要用它。不幸的是,当我需要一个正则匹配时,我也会遇到类似的问题:我基本上忘记了一些应该死的词法..。如果我每天都要写一

详细介绍:

其实我很喜欢正则匹配:他们做得很好。 其实他们太棒了,以至于绝大多数程序猿都要用它。

不幸的是,当我需要一个正则匹配时,我也会遇到类似的问题:我基本上忘记了一些应该死的词法..

。如果我每天都要写一个字,我一定会很容易记住他们,但我一年基本上很少写几个字..

在厌倦了一次又一次地查询和学习文本文档后,我计划根据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:判断一个单词是否一致的具体方法:

LIKE

2:以一种特定的方式找到文字:

Search

3:提取特征中的字符串信息内容:

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(); splitted.ForEach(x => { var pos = temp.IndexOf(x); if (pos > 0) { final.Add(temp.Substring(0, pos)); temp = temp.Substring(pos); } temp = temp.Substring(x.Length); }); if (temp.Length > 0) final.Add(temp); return final; } return null; } // private method which accepts the simplified pattern and transform it into a valid .net regex pattern: // it escapes standard regex syntax reserved characters // and transforms the simplified syntax into the nativeRegex one static Regex GetRegex(string searchPattern) { return new Regex(searchPattern .Replace("\", "\\") .Replace(".", "\.") .Replace("{", "\{") .Replace("}", "\}") .Replace("[", "\[") .Replace("]", "\]") .Replace(" ", "\ ") .Replace("$", "\$") .Replace(" ", "\s") .Replace("#", "[0-9]") .Replace("?", ".") .Replace("*", "\w*") .Replace("%", ".*") , RegexOptions.IgnoreCase); }

结论:本文的目的不是取代Regex,而是给出一个解决我们需要使用80%正则表达式的简单方法。