gksj 发表于 2024-1-25 14:47

关于正则表达式的问题

本帖最后由 gksj 于 2024-1-26 01:21 编辑


            //string strInput = "第一个字符串 - 第二个字符串 = 第三个字符串 - 第四个字符串";
            //string strInput = "第一个字符串 - 第二个字符串 - 第三个字符串";
            //string strInput = "第一个字符串 = 第二个字符串 = 第三个字符串";
            string strInput = "第一个字符串 - 第二个字符串 = 第三个字符串";//待处理字符串(条件返回)

            string rgxInput = "- %b = %c";                                 //用户自定义简化正则表达式

            string rg = rgxInput;

            rg = rg.Replace(@"%a", @"(?<text1>[\s\S]*?)");
            rg = rg.Replace(@"%b", @"(?<text2>[\s\S]*?)");
            rg = rg.Replace(@"%c", @"(?<text3>[\s\S]*?)");
            rg = rg.Replace(@"%d", @"(?<text4>[\s\S]*?)");

            Regex regex = new Regex(rg, RegexOptions.IgnoreCase);
            Match match = regex.Match(strInput);
            if (match.Success)
            {
                textBox2.Text = match.Groups["text2"].Value.Trim();//返回    %b
                textBox3.Text = match.Groups["text3"].Value.Trim();//返回    %c (返回数据为空???)
            }

返回结果textBox3.Text字符串为空,正常应该是第   "第三个字符串"   

如何解决最后提取的特征字符串是空的问题?
诚邀各位高手答疑,谢谢!

问题已解决!

string rgxInput = "- %b = %c$";                                 //用户自定义简化正则表达式

罗曼罗兰 发表于 2024-1-25 16:03

string strInput = "第一个字符串 - 第二个字符串 = 第三个字符串"; //待处理字符串(条件返回)

string rgxInput = "- %b = %c"; //用户自定义简化正则表达式

string resultRegex = rgxInput;
resultRegex = resultRegex.Replace(@"%b", @"(?<text2>[\s\S]*?)");
resultRegex = resultRegex.Replace(@"%c", @"(?<text3>[\s\S]*?)");

Regex regex = new Regex(resultRegex, RegexOptions.IgnoreCase);
Match match = regex.Match(strInput);
if (match.Success)
{
    textBox2.Text = match.Groups["text2"].Value.Trim(); //返回 %b
    textBox3.Text = match.Groups["text3"].Value.Trim(); //返回 %c
}
   你写的有问题,出在对 resultRegex 的赋值上。连续使用了四次 Replace,但每次都是在原始的 rgxInput 上操作,只有最后一次才生效

d199212 发表于 2024-1-25 16:05

string strInput = "第一个字符串 - 第二个字符串 = 第三个字符串";
string rgxInput = "- %b = %c";
string resultRegex = rgxInput.Replace(@"%a", @"(?<text1>[\s\S]*?)");
resultRegex = resultRegex.Replace(@"%b", @"(?<text2>[\s\S]*?)");
resultRegex = resultRegex.Replace(@"%c", @"(?<text3>[\s\S]*?)");
resultRegex = resultRegex.Replace(@"%d", @"(?<text4>[\s\S]*?)");
Regex regex = new Regex(resultRegex, RegexOptions.IgnoreCase);
Match match = regex.Match(strInput);
if (match.Success)
{
    textBox2.Text = match.Groups["text2"].Value.Trim();
    textBox3.Text = match.Groups["text3"].Value.Trim();
}

gksj 发表于 2024-1-25 16:30

罗曼罗兰 发表于 2024-1-25 16:03
string strInput = "第一个字符串 - 第二个字符串 = 第三个字符串"; //待处理字符串(条件返回)

string r ...

这不是重点,重点是最后一个匹配返回的字符串是空的

gksj 发表于 2024-1-26 01:45

附上完整测试代码


//string strText = "第一个字符串 - 第二个字符串 - 第三个字符串 - 第四个字符串";

            //string strText = "第一个字符串 - 第二个字符串 - 第三个字符串";//自定义 待处理字符串
            //strRegex = @"-(?<text2>[\s\S]*?)-(?<text3>[\s\S]*?)";//正则表达式


            //string strInput = "第一个字符串 - 第二个字符串 = 第三个字符串 - 第四个字符串";
            //string strInput = "第一个字符串 - 第二个字符串 - 第三个字符串";
            //string strInput = "第一个字符串 = 第二个字符串 = 第三个字符串";
            string strInput = "第一个字符串 - 第二个字符串 = 第三个字符串";//待处理字符串(条件返回)

            string rgxInput = "- %b% = %c%";                                 //用户自定义简化正则表达式

            if (rgxInput.EndsWith(@"%"))
            {
                rgxInput += "$";                        //如果取值参数在末尾则添加 $ 符号
            }

            string rg = rgxInput;

            rg = rg.Replace(@"%a%", @"(?<text1>[\s\S]*?)");
            rg = rg.Replace(@"%b%", @"(?<text2>[\s\S]*?)");
            rg = rg.Replace(@"%c%", @"(?<text3>[\s\S]*?)");
            rg = rg.Replace(@"%d%", @"(?<text4>[\s\S]*?)");

            Regex regex = new Regex(rg, RegexOptions.IgnoreCase);
            Match match = regex.Match(strInput);
            if (match.Success)
            {
                textBox2.Text = match.Groups["text2"].Value.Trim();//返回    %b
                textBox3.Text = match.Groups["text3"].Value.Trim();//返回    %c
            }
页: [1]
查看完整版本: 关于正则表达式的问题