Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为“编写正则表达式”;123456“;要打印123456吗?_C#_Regex - Fatal编程技术网

C# 如何为“编写正则表达式”;123456“;要打印123456吗?

C# 如何为“编写正则表达式”;123456“;要打印123456吗?,c#,regex,C#,Regex,嗨,我需要一个正则表达式来将#或*替换为“”(emptyString),我已经尝试了/[\\*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ http://ideone.com/MtjsX5 请在这方面需要你的帮助 我实际使用的是Grxml语法,如下所示 SWI_meaning = DIGITS.SWI_literal.replace( /[ ]+/g, '' ); SWI_mea

嗨,我需要一个正则表达式来将#或*替换为“”(emptyString),我已经尝试了
/[\\*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

http://ideone.com/MtjsX5
请在这方面需要你的帮助

我实际使用的是Grxml语法,如下所示

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

多亏了

而不是正则表达式,您可以使用它从字符串中仅过滤出数字。尝试以下方法

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

有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题

按照杰米·扎温斯基的建议,你只需打两次电话就可以了

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

注:这并不重要,但替换似乎是最快的。DS.

一个似乎缺失的选项,然后您几乎完全被覆盖。对于仅删除两个字符,使用Replace.Replace最快,紧随其后的是数组操作和StringBuilder

Linq Where和string.Join的使用使一切都稍微慢了一点,尽管这并不重要

你会惊讶地发现正则表达式(至少在.NET4.5下)并没有你想象的那么慢。它甚至比使用Linq更快。如果使用编译后的表达式或委托,可能可以将Linq表达式的速度提高一点

当您需要替换字符串中的较大部分或多于两个字符时,统计信息可能会更改

    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);
    }
当您需要替换除数字以外的所有内容时,这可能会变得更有趣。或者更具体地说是“#”和“*”。但最终,创建一个简单的测试,然后选择最容易理解和执行的方法可能是最好的解决方案

需要指出的一点是:并非所有提供的解决方案都能做完全相同的事情。有些只保留数字,而另一些则专门从给定的输入中删除两个字符。对于您的示例,这两个选项似乎都是有效的,但了解它们之间的差异很重要

使用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.

它是在c#code
string newString=string.Join(“,str.Where(char.IsDigit))中使用的grxml语法会短得多。@L.B,哦,是的。事实上,我是从中得到这个答案的,我只是被迷住了:)不需要在角色范围内“逃避”明星[#*]就可以了。在角色组中使用转义可能会让人非常困惑。只要试着只把角色放在其中,它们是团队的一部分,至少人们可以看到它的作用。@jessehouwing:谢谢你的提示,我不确定我是否需要它。我据此编辑了它。
    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);
    }
Join+Where
88
ArrayOperation
25
Join+Select
45
ReplaceReplace
18
Regex
39
Regex+Compiled
41
StringBuilder
19
        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);