0

我有一个行为相当奇怪的正则表达式,我不知道为什么。原始正则表达式:

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 方法在代码的其他部分被多次调用,没有发生任何意外,只是在这个 Regex 上我遇到了一个绊脚石。

4

2 回答 2

2

您看到的行为完全与您的应用程序逻辑有关,与正则表达式几乎没有关系。在GetMatchIndex,你是默认的index = 0。那么如果没有string[] input匹配的条目会发生什么?你回来了index = 0,它是 中DDR3的第一个元素的索引string[] input

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

The fix is pretty simple: When you are returning an index from an array in a programming language that uses 0-based numbering, the standard way to represent "not found" is with -1 so it doesn't get confused with the valid result of 0. So default index to -1 instead and handle a result of -1 as a special case, i.e., display an error message to the user like "No matches".

于 2013-03-07T21:44:46.360 回答
1

你的问题不正确:

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

事实上,结果似乎完全如您所愿。

于 2013-03-07T21:14:49.437 回答