首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

不懂,这个正则表达式解决思路

2012-04-08 
不懂,这个正则表达式class Program{static void Main(string[] args){string pattern @\d*Regex rgx

不懂,这个正则表达式
class Program
  {
  static void Main(string[] args)
  {
  string pattern = @"\d*";
  Regex rgx = new Regex(pattern);
  string sentence = "df97jk";
  foreach (Match match in rgx.Matches(sentence))
  {
  Console.WriteLine("{0}--{1}", match.Value, match.Index);
  }
  Console.ReadKey();
  }
  }
上面的正则表达式搜索连续的数字,最后的输出结果,怎么是这样的呢?
--0
--1
97--2
--4
--5
--6

不是只有97吗?其它怎么又输出了呢?
而下面这个例子
 class Program
  {
  static void Main(string[] args)
  {  
  string pattern = @"\b\w+es\b";
  Regex rgx = new Regex(pattern);
  string sentence = "Who writes these notes?";
  foreach (Match match in rgx.Matches(sentence))
  {
  Console.WriteLine("{0}--{1}", match.Value, match.Index);
  }
  Console.ReadKey();
  }
  }
搜索以es结尾的,最后的输出结果是:
writes--4
notes--17

其它不匹配的,为什么又没用输出来呢?


两个例子,为什么输出结果不同呢?

[解决办法]
这个问题我恰巧知道一点,请参考:
\d* 能匹配abx……z,也就是说任意的匹配都会true,如果是数字则结果是数字,如果非数字则结果为""

第二例中@"\b\w+es\b"不能匹配其他单词。
[解决办法]
主要是第一例中的"*"迷惑了结果,如果 是\d+则情况便不一样。
[解决办法]
* 是匹配0次或任意多次,可以一次都不匹配,也就是说匹配空,一个位置而已
+ 是匹配1次或任意多次,至少要匹配一次

*的例子中,除了97,其它匹配的都仅仅是个位置而已

比如我们限制输入为数字
//可以为空
^\d*$
//不可以为空
^\d+$

参考
正则基础之——NFA引擎匹配原理

[解决办法]
*匹配前面的\d任意次,所以即使不是数字也会被选出,如果要选出连续数字,对于你的"df97jk"可以用
(@"\d+");

热点排行