1

この形式の任意の文字列が与えられた場合

" および x = 'オライリー' および y = 'オライリー' および z = 'abc'"

オライリー部分に埋め込まれた ' 文字を '' に置き換える簡単な方法を誰か提案できますか? (もちろん、アポストロフィが埋め込まれた任意のシーケンスである可能性があります)。

文字列の一般的なパターンを制御することはできません。'zzz'bbb' の形式の部分を含むものであれば何でもかまいません。また、内側のアポストロフィを置き換える必要があるが、「外側の」アポストロフィを置き換える必要がない 'aaa'bbb'ccc' でさえあるかもしれません。

私は正規表現を試しましたが、残りはすべてです。困惑していますが、解決しなければなりません。

ティア。

4

4 に答える 4

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 のブーム
は、いくつかのスペースがあるようです

于 2013-11-14T13:33:25.857 に答える
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'
于 2013-11-14T13:33:15.587 に答える
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'

基本的に、すべての文字にインデックスを与える匿名オブジェクトのリストを取得し、'文字の接頭辞と接尾辞が付いたものだけをフィルタリングし、それらのオブジェクトの結果からインデックスによって入力を変更します。

于 2013-11-14T13:37:28.230 に答える
0

このようなsthを探していますか?

    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);
于 2013-11-14T13:43:55.910 に答える