我有一个行为相当奇怪的正则表达式,我不知道为什么。原始正则表达式:
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 上我遇到了一个绊脚石。