2

こんにちは、# または * を ""(emptyString) に置き換える正規表現が必要ですが、試してみまし/[\\*\\#]/gたが、機能していないようです。

http://ideone.com/MtjsX5

これであなたの助けが必要です。

私は実際にこれを以下のようにGrxml文法を使用しています

SWI_meaning          = DIGITS.SWI_literal.replace( /[ ]+/g, '' );
 SWI_meaning          = SWI_meaning.replace( /[\*\#]/g, '' );

ありがとう

4

4 に答える 4

5

正規表現ではなく、char.IsDigitを使用して、文字列から数字のみを除外できます。以下を試してください。

string str = "123456#";
string newString = string.Join("",
                         str.Select(r=> char.IsDigit(r) ? r.ToString():""));

編集:礼儀@ LB

string newString = String.Join("",str.Where(char.IsDigit));
于 2012-11-19T09:18:05.990 に答える
4
string str = "123456#";
string clean = Regex.Replace(str, @"[#*]", string.Empty);
于 2012-11-19T09:19:49.030 に答える
1

問題に直面したときに、「分かった、正規表現を使用する」と考える人もいます。現在、彼らには 2 つの問題があります。

また、Jamie Zawinski のアドバイスに従うには、replace を 2 回呼び出すだけです。

String str = "123456#*42#";
var result = str.Replace("*", "").Replace("#", "");

PS。それほど重要ではありませんが、Replace Replace が最速のようです。https://gist.github.com/4109899 DS.

于 2012-11-19T09:41:22.117 に答える
0

欠けているように見える1つのオプションがあれば、ほぼ完全にカバーされます。2文字だけを削除する場合は、Replace.Replaceの使用が最も速く、配列操作と文字列ビルダーがそれに続きます。

Linq Whereとstring.Joinを使用すると、それほど重要ではありませんが、すべてが少し遅くなります。

正規表現(少なくとも.NET 4.5では)が期待したほど遅くないことに驚かれることでしょう。Linqを使用するよりもさらに高速です。コンパイルされた式またはデリゲートを使用する場合は、Linq式をもう少し高速化できる可能性があります。

文字列のより大きな部分、または2文字よりも多くの文字を置き換える必要がある場合、統計が変更される可能性があります。

    static void Main(string[] args)
    {
        string str = "123456#23876587234687237*723547623547523745273#";

        Console.WriteLine("Join+Where");
        Test(s => String.Join("",s.Where(char.IsDigit)), str);

        Console.WriteLine("ArrayOperation");
        Test(s => new string(Array.FindAll(s.ToCharArray(), char.IsDigit)), str);

        Console.WriteLine("Join+Select");
        Test(s => string.Join("", s.Select(r=> char.IsDigit(r) ? r.ToString():"")), str);

        Console.WriteLine("ReplaceReplace");
        Test(s => s.Replace("*", "").Replace("#", ""), str);

        Console.WriteLine("Regex");
        Test(s => Regex.Replace(s, "[#*]", ""), str);

        Console.WriteLine("Regex");
        Regex rx = new Regex("[#*]", RegexOptions.Compiled);
        rx.Match(""); // Precompile for better results
        Test(s => rx.Replace(s, ""), str);

        Console.WriteLine("StringBuilder");
        Test(s => new StringBuilder(s).Replace("*", "").Replace("#", "").ToString(), str);
        Console.ReadLine();

    }

    public static void Test(Func<string,string> proposedSolution, string input)
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        Thread.Sleep(5000);

        Stopwatch sw = new Stopwatch();
        sw.Start();

        for (int i = 0; i < 1000; i++)
        {
            string val = proposedSolution(input);
            Debug.Write(val);
        }

        sw.Stop();

        Console.WriteLine(sw.ElapsedMilliseconds);
    }

「123456#23876587234687237 * 723547623547523745273#」の出力は次のとおりです(正規表現を適切に使用すると、人々が信じるほど遅くないことに気付くでしょう。

Join+Where
88
ArrayOperation
25
Join+Select
45
ReplaceReplace
18
Regex
39
Regex+Compiled
41
StringBuilder
19

これは、数字以外のすべてを置き換える必要がある場合に、より興味深いものになる可能性があります。または、より具体的には「#」と「*」。しかし、最終的には、簡単なテストを作成してから、最も理解しやすく実行しやすい方法を選択することがおそらく最善の解決策です。

注意すべき点の1つ:提供されているすべてのソリューションがまったく同じことを行うわけではありません。数字だけを保持するものもあれば、指定された入力から2文字を削除するものもあります。サンプルの場合、両方のオプションが有効であるように見えますが、違いを理解することが重要です。

LINQを使用して#と*だけを削除するのと同じオプション:

        char[] Removechars = new[] { '#', '*' };

        Console.WriteLine("Join+Where");
        Test(s => String.Join("", s.Where(c => !Removechars.Contains(c))), str);

        Console.WriteLine("ArrayOperation");
        Test(s => new string(Array.FindAll(s.ToCharArray(), c => !Removechars.Contains(c))), str);

        Console.WriteLine("Except");
        Test(s => new string(s.ToCharArray().Except(Removechars).ToArray()), str);

        Console.WriteLine("Join+Select");
        Test(s => string.Join("", s.Select(c => !Removechars.Contains(c) ? c.ToString():"")), str);

これらのオプションはすべて、IsDigitまたは!IsDigitを使用するよりも低速です。

于 2012-11-19T11:48:25.907 に答える