代码改变世界

正则表达式

2017-06-04 17:00  Dirichlet  阅读(209)  评论(0编辑  收藏  举报

 用途:

1. 判断给定的整个字符串是否满足某pattern。//Regex.IsMatch

2. 在给定的整个字符串中找出满足某pattern的所有字串。给定字符串里是否存在某字串满足某pattern。//Regex.Matchs,Regex.IsMatch

上述pattern就是正则表达式。

 

任何的pattern都要@修饰,比如@"^[^/:*?""<>|\r\n]{1,244}$",@"\d{2}-\d{5}"。

用途1)的pattern的首尾要有^,$ e.g. 文件夹名字的正则表达式 @"^[^/:*?""<>|\r\n]{1,244}$"

用途2)的pattern的首尾不能有^,$。

  string input3 = "adf234-56789sdf123-76589asdf";
  string pattern3 = @"\d{2}-\d{5}";

  字串34-56789,23-76589都会搜索出来。

 

例子分析

1.

使用多线模式,其中 ^ 和 $ 匹配每行的开头和末尾,不是输入字符串的开头和末尾。

默认情况下,$ 仅与输入字符串的末尾匹配。 如果指定了 RegexOptions.Multiline 选项,它将与换行符 (\n) 或输入字符串的末尾匹配。 但是,它并不与回车符/换行符的组合匹配。 若要成功匹配它们,使用子表达式 \r?$ 只替代 $。当然最终的match结果不含^,$所匹配的字符。

下面例子来自http://msdn.microsoft.com/zh-cn/library/vstudio/yd1hzczs.aspx,但是稍作修改,因为windows下换行是由\r\n组成的,所以这里用WriteLine。

第一个 pattern = @"^(\w+)\s(\d+)$";显然不行。

$这里要匹配\n,而因为windows下换行是由\r\n组成的,所以pattern里还有要有个\r?,?必须加上,你不能假设换行肯定是由\r\n组成的。

一个缺点就是匹配的match.Value字符的最后有个\r.

 1 static void Test3()
 2         {
 3             StringWriter writer = new StringWriter();
 4             writer.WriteLine("Joe 164");
 5             writer.WriteLine("Sam 208");
 6             writer.WriteLine("Allison 211");
 7             writer.WriteLine("Gwen 171");
 8             
 9             string input = writer.ToString();
10             string pattern = @"^(\w+)\s(\d+)$";
11             bool matched = false;
12 
13             Console.WriteLine("Without Multiline option:");
14             foreach (Match match in Regex.Matches(input, pattern))
15             {
16                 matched = true;
17                 break;
18             }
19 
20             if (!matched)
21                 Console.WriteLine("   No matches.");
22             Console.WriteLine();
23 
24             // Redefine pattern to handle multiple lines.
25             pattern = @"^(\w+)\s(\d+)\r?$";
26             Console.WriteLine("With multiline option:");
27             foreach (Match match in Regex.Matches(input, pattern, RegexOptions.Multiline))
28             {
29                 Console.WriteLine(match.Value); // print whole the match
30             }
31         }

 

 例2:

http://zhidao.baidu.com/question/578743567.html?from=pubpage&msgtype=2

找出输入文本的非空的第一行。

 1         static void Test4()
 2         {
 3             StringWriter writer = new StringWriter();
 4             writer.WriteLine();
 5             writer.WriteLine();
 6             writer.WriteLine();
 7             writer.WriteLine("Joe 164");
 8             writer.WriteLine("Sam 208");
 9             writer.WriteLine("Allison 211");
10             writer.WriteLine("Gwen 171");
11 
12             string input = writer.ToString();
13 
14             // Redefine pattern to handle multiple lines.
15             string pattern = @"\b.+(?=(\r?\n))";
16             Console.WriteLine("With multiline option:");
17 
18             Match mat = Regex.Match(input, pattern, RegexOptions.Multiline);
19             
20             //foreach (Match match in Regex.Matches(input, pattern, RegexOptions.Multiline))
21             //{
22                 Console.WriteLine(mat.Value); // print whole the match
23             //}
24         }

 

 

基本语法,参考文章:

http://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx

http://msdn.microsoft.com/zh-cn/library/vstudio/yd1hzczs.aspx