Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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# 去掉字母或标记,只留下数字和撇号_C#_.net_Asp.net_Regex_String - Fatal编程技术网

C# 去掉字母或标记,只留下数字和撇号

C# 去掉字母或标记,只留下数字和撇号,c#,.net,asp.net,regex,string,C#,.net,Asp.net,Regex,String,案件如下: 82& 82,9 abse82,9>dpkg 后正则表达式 八十二 82,9 82,9 请帮助我在c上使用Regex做这件事。使用这个模式:\d+(,\d+) \d:匹配0-9之间的数字 +:至少匹配一次模式,因此\d+将至少匹配一个数字 (,\d+):这表示一个组(使用括号),该组与逗号后跟数字匹配,并且可以选择匹配它(由于组末尾的?) 代码段: string[] inputs = { "82&?", "82,9", "abse82,9>dpkg", "f

案件如下:

  • 82&
  • 82,9
  • abse82,9>dpkg
后正则表达式

  • 八十二
  • 82,9
  • 82,9

请帮助我在c上使用Regex做这件事。

使用这个模式:
\d+(,\d+)

  • \d
    :匹配0-9之间的数字
  • +
    :至少匹配一次模式,因此
    \d+
    将至少匹配一个数字
  • (,\d+)
    :这表示一个组(使用括号),该组与逗号后跟数字匹配,并且可以选择匹配它(由于组末尾的
代码段:

string[] inputs = { "82&?", "82,9", "abse82,9>dpkg", "foobar" };
foreach (var input in inputs)
{
    Match m = Regex.Match(input, @"\d+(,\d+)?");
    if (m.Success)
    {
        Console.WriteLine(m.Value);
    }
    else
    {
        Console.WriteLine("No match!");
    }
}

使用此模式:
\d+(,\d+)

  • \d
    :匹配0-9之间的数字
  • +
    :至少匹配一次模式,因此
    \d+
    将至少匹配一个数字
  • (,\d+)
    :这表示一个组(使用括号),该组与逗号后跟数字匹配,并且可以选择匹配它(由于组末尾的
代码段:

string[] inputs = { "82&?", "82,9", "abse82,9>dpkg", "foobar" };
foreach (var input in inputs)
{
    Match m = Regex.Match(input, @"\d+(,\d+)?");
    if (m.Success)
    {
        Console.WriteLine(m.Value);
    }
    else
    {
        Console.WriteLine("No match!");
    }
}

如果你只是在寻找那些角色,并试图删除其他任何东西,你可以做以下操作

    var strings = new List<string>()
                    {
                        "82&?",
                        "82,9",
                        "abse82,9>dpkg"
                    };
    var reg = new Regex("[^0-9,]*", RegexOptions.None);
    var output = new List<string>();
    foreach(var str in strings)
    {
        output.Add(reg.Replace(str, ""));
    }
var strings=新列表()
{
"82&?",
"82,9",
“abse82,9>dpkg”
};
var reg=new Regex(“[^0-9,]*”,RegexOptions.None);
var输出=新列表();
foreach(字符串中的var str)
{
输出.添加(寄存器替换(str,“”);
}

如果您只是在寻找这些字符并试图删除其他字符,则可以执行以下操作

    var strings = new List<string>()
                    {
                        "82&?",
                        "82,9",
                        "abse82,9>dpkg"
                    };
    var reg = new Regex("[^0-9,]*", RegexOptions.None);
    var output = new List<string>();
    foreach(var str in strings)
    {
        output.Add(reg.Replace(str, ""));
    }
var strings=新列表()
{
"82&?",
"82,9",
“abse82,9>dpkg”
};
var reg=new Regex(“[^0-9,]*”,RegexOptions.None);
var输出=新列表();
foreach(字符串中的var str)
{
输出.添加(寄存器替换(str,“”);
}

如果您在.NET3.5+上,您可以使用
LINQ
。不使用正则表达式(速度更快)的解决方案如下:

var strings = new List<string>() { "82&?", "82,9", "abse82,9>dpkg" };
var result = strings.Select(s =>
    String.Join("",
        s.Where(c => char.IsNumber(c) || c == ',')
        .ToArray()) /* .ToArray() is not needed on .NET 4 */
    ).ToList();
使用我得到的答案上给出的方法,运行100000次迭代的测试(使用秒表):

Fn: BrunoLM (Method 1)
Ticks: 524999

Fn: BrunoLM (Method 2)
Ticks: 729460

Fn: Ahmad
Ticks: 1323366

Fn: Josh
Ticks: 3783158
使用1000长度的字符串进行相同的测试:

var strings = new List<string>() { "82&?887..2".PadRight(1000, '2'), "82,9".PadRight(1000, '1'), "abse82,9>dpkg".PadRight(1000, 'f') };
进一步阅读:


正则表达式和文本大小n

如果您在.NET3.5+上,则可以使用
LINQ
。不使用正则表达式(速度更快)的解决方案如下:

var strings = new List<string>() { "82&?", "82,9", "abse82,9>dpkg" };
var result = strings.Select(s =>
    String.Join("",
        s.Where(c => char.IsNumber(c) || c == ',')
        .ToArray()) /* .ToArray() is not needed on .NET 4 */
    ).ToList();
使用我得到的答案上给出的方法,运行100000次迭代的测试(使用秒表):

Fn: BrunoLM (Method 1)
Ticks: 524999

Fn: BrunoLM (Method 2)
Ticks: 729460

Fn: Ahmad
Ticks: 1323366

Fn: Josh
Ticks: 3783158
使用1000长度的字符串进行相同的测试:

var strings = new List<string>() { "82&?887..2".PadRight(1000, '2'), "82,9".PadRight(1000, '1'), "abse82,9>dpkg".PadRight(1000, 'f') };
进一步阅读:


正则表达式和文本大小n

Regex在搜索更大的字符串时速度更快,但根据我的经验,如果您使用的字符串不超过50个字符,请不要考虑Regex。Regex速度较慢并不意味着这不是一个好的答案。尝试使用“foo,bar”(带逗号)作为您的解决方案或JoshVarga的解决方案的输入。目前,两种解决方案都将返回逗号。不认为这是一场比赛。添加逻辑来处理这种情况,regex很快就占据了IMHO的主导地位。当然OP没有说他有这样的情况,所以这可能不是问题。@Ahmad:谢谢你指出这一点,我想我已经用
方法2
解决了。我没说你的答案不好。我是说Regex在某些情况下是很慢的。如果他的文本有很多字符,那么您的解决方案会比上面显示的快得多。@Kirk:谢谢您的分享。我对1000长度的字符串和Ahmad的正则表达式进行了测试。:)@布鲁诺:我明白,我只是想说速度本身并不总是一个明确的标准,它最终取决于数据(正如你在基准测试中所展示的那样)。顺便说一句,我只是在猜测OP真正想要什么。关于“foo,bar”的例子,我不知道它是否扩展到“8,a”。在这种情况下,OP可能需要“8”,或者他们可能只需要逗号后面出现一个数字(正如您所看到的那样)。OP需要澄清。我不是想让你用我的评论编写OP没有要求的代码!搜索更大的字符串时,Regex会更快,但根据我的经验,如果您不使用超过50个字符的字符串,请不要考虑Regex。Regex速度较慢并不意味着这不是一个好的答案。尝试使用“foo,bar”(带逗号)作为您的解决方案或JoshVarga的解决方案的输入。目前,两种解决方案都将返回逗号。不认为这是一场比赛。添加逻辑来处理这种情况,regex很快就占据了IMHO的主导地位。当然OP没有说他有这样的情况,所以这可能不是问题。@Ahmad:谢谢你指出这一点,我想我已经用
方法2
解决了。我没说你的答案不好。我是说Regex在某些情况下是很慢的。如果他的文本有很多字符,那么您的解决方案会比上面显示的快得多。@Kirk:谢谢您的分享。我对1000长度的字符串和Ahmad的正则表达式进行了测试。:)@布鲁诺:我明白,我只是想说速度本身并不总是一个明确的标准,它最终取决于数据(正如你在基准测试中所展示的那样)。顺便说一句,我只是在猜测OP真正想要什么。关于“foo,bar”的例子,我不知道它是否扩展到“8,a”。在这种情况下,OP可能需要“8”,或者他们可能只需要逗号后面出现一个数字(正如您所看到的那样)。OP需要澄清。我不是想让你用我的评论编写OP没有要求的代码!