替换嵌入式撇号,但仅替换某些撇号

时间:2013-11-14 13:22:01

标签: c# regex escaping

给出这种形式的任意字符串

“和x ='o'reilly'和y ='o'reilly'和z ='abc'”

任何人都可以建议一种直接的方式来代替''for the'中包含在o'reilly部分的字符吗? (它当然可以是任何带有嵌入式撇号的序列。)

我无法控制字符串的一般模式。它可能是任何包含'zzz'bbb'形式的部分,甚至可能是'aaa'bbb'ccc',其中内部撇号需要被替换,而不是“外部”撇号。

我尝试过正则表达式,其余的都是。我很难过,但我得解决它!

TIA。

4 个答案:

答案 0 :(得分:0)

如果你愿意假设嵌入式撇号总是在两边都有一个字母数字字符(而不是空格),那么你可以这样做:

(\w)'(\w)

然后替换为:

\1\2

这将具有删除字母数字之间的撇号的效果。看看这个RegExr:http://regexr.com?376k9

示例:

'hello there i am a representative from 'o'reilly' publishing and i am '2'3' years old'

变为:

'hello there i am a representative from 'oreilly' publishing and i am '23' years old'

答案 1 :(得分:0)

好吧,我可能会用这个正则表达式...因为你真正需要的是找到撇号,前后字母不是白色空格......应该很容易。

否则,你可以运行一个string.indexof(“'”),检查之前和之后的位置是不是空格......然后BOOM ......把它吹出水面......

string test = "aoeu'aou ";
string bad_test = "aoeu ' aoeu";

var index = test.IndexOf("'");
if (!test[index-1].Equals(' ') && !test[index+1].Equals(' '))
Console.Out.WriteLine("Boom at index "+ index);
else
Console.Out.WriteLine("seems we have some spaces");

index = bad_test.IndexOf("'");
if (! bad_test[index - 1].Equals(' ') && !bad_test[index + 1].Equals(' '))
Console.Out.WriteLine("Boom at index " + index);
else
Console.Out.WriteLine("seems we have some spaces");

这将输出:

  

指数4的繁荣   好像我们有一些空格

答案 2 :(得分:0)

以下是您的工作示例:

class Program
{
    static void Main(string[] args)
    {
        var input = "and x = 'o'reilly' and y = 'o'reilly' and z = 'abc' ";
        var output = input
            .Select((c, i) => new { Character = c, Index = i })
            .Where(o =>
            {
                if (o.Character != Convert.ToChar("'")) { return false; }

                var i = o.Index;
                var charBefore = (i == 0) ? false :
                    char.IsLetter(input[i - 1]);
                var charAfter = (i == input.Length - 1) ? false :
                    char.IsLetter(input[i + 1]);

                return charBefore && charAfter;
            })
            .ToList();

        foreach (var item in output)
        {
            input = input.Remove(item.Index, 1);
            input = input.Insert(item.Index, "\"");
        }

        Console.WriteLine(input);
        if (Debugger.IsAttached) { Console.ReadKey(); }
    }
}

输出:

and x = 'o"reilly' and y = 'o"reilly' and z = 'abc'

基本上,它只是获取一个匿名对象列表,它为每个字符提供一个索引,过滤到只有'的前缀并以字母为后缀,然后通过索引修改输入这些对象的结果。

答案 3 :(得分:0)

你在找这样的吗?

    var splittedString = " and x = 'o'reilly' and y = 'o'reilly' and z = 'abc' ".Split(new char[] {' '},
                                                                                       StringSplitOptions
                                                                                           .RemoveEmptyEntries);
    List<string> listStrings = splittedString.Select(s => s.Trim('\'').Replace('\'', '"')).ToList();
    var finalResult = "";

    var prevMatchIsEqualToSign = false;
    foreach (var s in listStrings)
    {
        if (prevMatchIsEqualToSign)
        {
            finalResult += "'" + s + "' ";
        }
        else if (s == "=")
        {
            finalResult += "= ";
            prevMatchIsEqualToSign = true;
            continue;
        }
        else
        {
            finalResult += s +" ";
        }
        prevMatchIsEqualToSign = false;

    }
    Console.WriteLine(finalResult);