我想用正则表达式来转义单引号的问题。
若单引号前面没有\,
则在前面加反斜杠。若有多个则替换为1个反斜杠。
我的代码如下//替换表达式
private string ReplaceQuote(string input)
    {
        string pattern = @"(?:\\)*(?=['])";
        return Regex.Replace(input, pattern, new MatchEvaluator(ReplaceText));
    }// 匹配项
public string ReplaceText(Match m)
    {
        string str = m.Value;
        int n = m.Index;
        if (str.Length >= 1)
        {
            return string.Empty;
        }
        return @"\";
    }
要替换的文本string strInput = @"'qq''''\''\\\\\\\\\\\'dnaaaa";
        string re = ReplaceQuote(strInput);
返回的是"\\'qq\\'\\'\\'\\'\\'\\'\\'dnaaaa"  想要的结果
我的理解是若只匹配到单引号,则在此单引号前插入1个反斜杠(匹配了前面的位置),匹配到多个反斜杠(匹配的多个反斜杠字符),则用1个反斜杠替换它。
其实2个不都是替换为1个反斜杠的吗。
我认为的写法是如下
public string ReplaceText(Match m)
    {
        return @"\";
    }但返回的是"\\'qq\\'\\'\\'\\'\\\\'\\'\\\\'dnaaaa" 不是想要的结果请高人指点。

解决方案 »

  1.   

    ([\\]+|(?<=[^\\]))'如:
    this.textBox2.Text=Regex.Replace(this.textBox2.Text,@"([\\]+|(?<=[^\\]))'","\\'");
      

  2.   

    我基本上知道了。用个简单的字符串把。 string str = @"\\'dnaaaa";
    从字符串的位置0开始查找\,零位置右边有1个反斜杠符合匹配,
    继续前进,又找到一个。在位置2处的右边没有符合的匹配,但右边接的是单引号。
    故此次匹配组返回\\    会在位置0处插入一个反斜杠并替换掉匹配的2个反斜杠。接着,在位置2处右边接着0个反斜杠,且该位置右边紧接着单引号,故此位置匹配。 会在位置2处插入一个反斜杠且替换掉0个反斜杠。
    感觉理解的还是不是很透彻。
      

  3.   

    csdn真是不好用,连发个帖子,插入个图片都不能从本地上传。
      

  4.   


                string test = @"'qq''''\''\\\\\\\\\\\'dnaaaa";
                Regex re = new Regex(@"(\\*')");
                Console.WriteLine(test);
                Console.WriteLine(re.Replace(test, @"\'"));
                Console.ReadKey();
    楼主是不是搞复杂了?我觉得挺好整的呢。
      

  5.   


        public string ReplaceText(Match m)
        {
            string str = m.Value;
            int n = m.Index;
            if (str.Length >= 1)
            {
                return string.Empty;
            }
            return @"\";
        }
    上面这个
      在匹配长度大于1时,返回空串,也就是将匹配的结果替换为空
      在匹配长度为0时,返回反斜杠,也就是用反斜杠替换原来的0长度匹配你下面的这个,则总是返回反斜杠,所以不对了    public string ReplaceText(Match m)
        {
            return @"\";
        }
      

  6.   

    发现一个更怪异的情况:
    Regex.Replace("\\abc",@"\\*","\\");
    猜下结果是什么?
      

  7.   

    楼主的代码要是改成下面这样就正确了。。(问题出在当pattern是\\*的时候,并且跟后面是否有(?=XXX)没关系)//替换表达式
    private string ReplaceQuote(string input)
        {
            string pattern = @"(?:\\)*')";//这里改成string pattern = @"\\*'";也可以
            return Regex.Replace(input, pattern, new MatchEvaluator(ReplaceText));
        }// 匹配项
    public string ReplaceText(Match m)
        {
            return @"\'";
        }
      

  8.   

    我的意思即是说\'满足string pattern = @"(?:\\)*(?=['])";的匹配,这里匹配到的字符串是\,
    接着再往后匹配,就能匹配到\后的'号,这里匹配到的字符串是空串。。
    所以进行替换的话,\'会被替换成\\'
      

  9.   


    楼主的这个理解已经基本上差不多了就以楼主举的这个例子吧string pattern = @"(?:\\)*(?=['])";
    第一轮匹配,首先从位置0开始匹配,因为(?:\\)*是贪婪匹配,所以会尽可能多的匹配,遇到第一个字符\匹配成功,接着尝试匹配第二个字符\,匹配成功,接着尝试匹配第三个字符',匹配失败,回溯,控制权交给(?=[']),因为它是零宽度的,所以它会尝试匹配位置2,匹配成功,此时整个表达式匹配成功,匹配结果是\\,也就是第一个字符和第二个字符接下来进入第二轮匹配,此时应该从位置2开始匹配,因为(?:\\)*是贪婪匹配,所以它首先要尝试一下,尝试匹配第一个字符',匹配失败,回溯,控制权交给(?=[']),尝试匹配位置2,匹配成功,此时整个表达式匹配成功,匹配的结果就是位置2,是零宽度的接下来进入第三轮匹配,从'后的位置开始,匹配失败,继续,一直尝试匹配到结束,都失败能看得出来楼主看过《精通正则表达式》这本书,这是本好书,但也不要陷到这本书里
    楼主的例子,如果是用来研究原理的,我不做什么评论,只能认为它并不是一个好例子
    如果是用来实现这一功能的,我只能说是舍本逐末了,一个正则表达式就可以搞定的问题,却要费这么大劲