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方法被调用的一些代码的其他部分次无事故,那只是在这一个正则表达式,我已经打了一个绊脚石。
您所看到的行为完全与您的应用程序逻辑有关,而与正则表达式无关。在GetMatchIndex
中,您违约index = 0
。那么如果string[] input
中的条目都不匹配会发生什么?你找回index = 0
,这是DDR3
的索引,string[] input
中的第一个元素。
在第一个正则表达式中看不到该行为,因为它匹配1.35v
。但是,当您将空间添加到末尾时,它与分割输入中的任何条目都不匹配,因此默认情况下您会收回第一个空间,这恰好是DDR3
。此外,if (rgx1Match.Success)
并没有真正的帮助,因为您首先检查整个字符串中的匹配项(因为这里有空格而匹配),然后在分割后搜索索引,从而删除空格!
修复非常简单:当您使用基于0的编号的编程语言从数组中返回索引时,表示“未找到”的标准方式是-1,因此它不会混淆有效结果为0
。因此,默认index
至-1
代替并且作为特殊情况处理-1
的结果,即向用户显示错误消息,如“不匹配”。
Doh。那么,这解释了它。新鲜的眼睛,我猜。新手的错误,我假设因为当我改变正则表达式时发生了变化,其中存在问题。现在修复一些破碎的代码。 – spugm1r3 2013-03-07 21:50:38
@ spugm1r3:您可能还想熟悉IDE中的调试器,因为逐行检查代码并查看正在发生的事情可能非常有用,而不是“猜测”问题出在哪里。当某个变量的第一个符号含有意想不到的值时,您会回头看看逻辑并尝试理解错误。 – mellamokb 2013-03-07 21:53:11
会做。教你自己如何编程,这是成长中的痛苦......谢谢你,先生。 – spugm1r3 2013-03-07 21:59:10
你的问题是不正确的:
new Regex(@"(?i)\d\.\d\dv\s").Match("DDR3").Success
是假
实际上,结果似乎正是上班,只要你愿意。
这个问题没有错。我有一个输出,我改变了正则表达式,我的输出改变了,原因我不明白。正如智者所认识的美拉莫克,这是问题背后的问题。 – spugm1r3 2013-03-07 21:56:07
不知道如何获得第二个正则表达式来匹配'DDR3'。它不适合我:http://ideone.com/pl2PYb – mellamokb 2013-03-07 20:53:35
无法重复。你确定你没有另一个正则表达式仍然被称为'regex'而不是'rgx'并偶然匹配吗? – 2013-03-07 20:53:52
我不能肯定地说为什么它不可重复,因为我不明白它为什么会发生。但是,我所做的唯一更改是添加'\ s'。如果我删除'\ s',DDR3不再匹配。 – spugm1r3 2013-03-07 20:59:23