c中不寻常的正则表达式行为#

问题描述:

我有一个表现得相当奇怪的正则表达式,我不明白为什么。原正则表达式:c中不寻常的正则表达式行为#

Regex regex = new Regex(@"(?i)\d\.\d\dv"); 

表达式返回/匹配一个等同于1.35V或1.35V,这就是我想要的。但是,它对我的​​程序来说并不足够,它会返回一些我不需要的字符串。

修改正则表达式:

Regex rgx = new Regex(@"(?i)\d\.\d\dv\s"); 

只需添加“\ s”来表达,它匹配/返回DDR3,这是不是在所有我想要的东西。我猜想某种反演正在发生,但我不明白为什么和我似乎找不到解释它的参考。我想要做的只是在表达式末尾添加一个空格来过滤更多结果。

任何帮助将不胜感激。

编辑: 这是一个功能测试用例,其中包含我的代码中正在进行的通用版本。只需在Visual Studio中打开一个新的WPF,复制并粘贴,它应该为您重复结果。

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
    { 
     InitializeComponent(); 
    } 
    Regex rgx1 = new Regex(@"(?i)\d\.\d\dv"); 
    Regex rgx2 = new Regex(@"(?i)\d\.\d\dv\s"); 

    string testCase = @"DDR3 Vdd   |   |   |   |   | 1.35v |"; 

    string str = null; 

    public void IsMatch(string input) 
    { 
     Match rgx1Match = rgx1.Match(input); 
     if (rgx1Match.Success) 
     { 
      GetInfo(input); 
     } 
    } 
    public void GetInfo(string input) 
    { 
     Match rgx1Match = rgx1.Match(input); 
     Match rgx2Match = rgx2.Match(input); 

     string[] tempArray = input.Split(); 
     int index = 0; 

     if (rgx1Match.Success) 
     { 
      index = GetMatchIndex(rgx1, tempArray); 
      str = tempArray[index].Trim(); 
      global::System.Windows.Forms.MessageBox.Show("First expression match: " + str); 
     } 
     if (rgx2Match.Success) 
     { 
      index = GetMatchIndex(rgx2, tempArray); 
      str = tempArray[index].Trim(); 
      System.Windows.Forms.MessageBox.Show(input); 
      global::System.Windows.Forms.MessageBox.Show("Second expression match: " + str); 
     } 
    } 
    public int GetMatchIndex(Regex expression, string[] input) 
    { 
     int index = 0; 

     for (int i = 0; i < input.Length; i++) 
     { 
      if (index < 1) 
      { 
       Match rgxMatch = expression.Match(input[i]); 
       if (rgxMatch.Success) 
       { 
        index = i; 
       } 
      } 
     } 
     return index; 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     string line; 
     IsMatch(testCase); 
    } 

} 

}

的GetMatchesIndex方法被调用的一些代码的其他部分次无事故,那只是在这一个正则表达式,我已经打了一个绊脚石。

+1

不知道如何获得第二个正则表达式来匹配'DDR3'。它不适合我:http://ideone.com/pl2PYb – mellamokb 2013-03-07 20:53:35

+1

无法重复。你确定你没有另一个正则表达式仍然被称为'regex'而不是'rgx'并偶然匹配吗? – 2013-03-07 20:53:52

+0

我不能肯定地说为什么它不可重复,因为我不明白它为什么会发生。但是,我所做的唯一更改是添加'\ s'。如果我删除'\ s',DDR3不再匹配。 – spugm1r3 2013-03-07 20:59:23

您所看到的行为完全与您的应用程序逻辑有关,而与正则表达式无关。在GetMatchIndex中,您违约index = 0。那么如果string[] input中的条目都不匹配会发生什么?你找回index = 0,这是DDR3的索引,string[] input中的第一个元素。

在第一个正则表达式中看不到该行为,因为它匹配1.35v。但是,当您将空间添加到末尾时,它与分割输入中的任何条目都不匹配,因此默认情况下您会收回第一个空间,这恰好是DDR3。此外,if (rgx1Match.Success)并没有真正的帮助,因为您首先检查整个字符串中的匹配项(因为这里有空格而匹配),然后在分割后搜索索引,从而删除空格!

修复非常简单:当您使用基于0的编号的编程语言从数组中返回索引时,表示“未找到”的标准方式是-1,因此它不会混淆有效结果为0。因此,默认index-1代替并且作为特殊情况处理-1的结果,即向用户显示错误消息,如“不匹配”。

+0

Doh。那么,这解释了它。新鲜的眼睛,我猜。新手的错误,我假设因为当我改变正则表达式时发生了变化,其中存在问题。现在修复一些破碎的代码。 – spugm1r3 2013-03-07 21:50:38

+0

@ spugm1r3:您可能还想熟悉IDE中的调试器,因为逐行检查代码并查看正在发生的事情可能非常有用,而不是“猜测”问题出在哪里。当某个变量的第一个符号含有意想不到的值时,您会回头看看逻辑并尝试理解错误。 – mellamokb 2013-03-07 21:53:11

+0

会做。教你自己如何编程,这是成长中的痛苦......谢谢你,先生。 – spugm1r3 2013-03-07 21:59:10

你的问题是不正确的:

new Regex(@"(?i)\d\.\d\dv\s").Match("DDR3").Success 是假

实际上,结果似乎正是上班,只要你愿意。

+0

这个问题没有错。我有一个输出,我改变了正则表达式,我的输出改变了,原因我不明白。正如智者所认识的美拉莫克,这是问题背后的问题。 – spugm1r3 2013-03-07 21:56:07