C#:从字符串中删除多余的文本

时间:2017-11-13 18:38:17

标签: c# string

好的,所以在环顾这里之后,我找到了一个满足95%的要求的解决方案,虽然我认为此时可能需要重做。

问题

假设我提供的值范围为" 1000 - 1009 ABC1 ABC SOMETHING ELSE"我只需要1000 - 1009部分。我需要能够从提供的字符串中删除多余的字符,即使它们确实是可接受的字符,但前提是它们是带有文本的辅助字符串的一部分。 (对不起,如果这个描述看起来很奇怪,我今天的思想并不是全力以赴。)

当前解决方案

我目前有一个简单的方法,利用Linq只返回接受的字符,但这将返回" 1000 - 10091"这不是我需要的范围。我已经考虑过使用IsDigitIsLetter对我的优势进行字符串循环并与之前的字符进行比较,但接下来是更换不可接受的字符或删除它们的问题。我想如果我给它一两天,我可以用清醒的头脑解决它,但它需要在一天结束时完成,而我正在敲击键盘。

void RemoveExcessText(ref string val) {
    string allowedChars = "0123456789-+>";
    val = new string(val.Where(c => allowedChars.Contains(c)).ToArray());
}


// Alternatively?
char previousChar = ' ';
for (int i = 0; i < val.Length; i++) {
    if (char.IsLetter(val[i])) {
        previousChar = val[i];
        val.Remove(i, 1);
    } else if (char.IsDigit(val[i])) {
        if (char.IsLetter(previousChar)) {
            val.Remove(i, 1);
        }
    }
}

但是我如何计算空格并留在+, - 和&gt; charactrers?我今天在这个问题上失去了理智。

3 个答案:

答案 0 :(得分:4)

为什么不使用正则表达式?

Regex.Match("1000 - 1009 ABC1 ABC SOMETHING ELSE", @"^(\d+)([\s\-]+)(\d+)");

应该给你你想要的东西

I made a fiddle

答案 1 :(得分:1)

您将正则表达式与捕获组一起使用:

Regex r = new Regex("^(?<v>[-0-9 ]+?)");

这意味着&#34;从输入字符串(^)的开头匹配[0到9或空格或连字符],并保持这些字符出现的次数(+?)并将其存储到变量v(?)&#34;

我们这样得到它:

r.Matches(input)[0].Groups["v"].Value

请注意,如果输入字符串不匹配,则匹配集合将为0,并且对[0]的调用将崩溃。为此,您可能希望通过一些额外的错误检查来强化它:

MatchCollection mc = r.Matches(input);
if(mc.Length > 0)
  MessageBox.Show(mc[0].Groups["v"].Value;

答案 2 :(得分:0)

您可以将其与正则表达式匹配。 \ d {1,4}表示至少匹配十进制数字一次,最多4次。其次是空格,连字符,空格和1到4位数字,然后是其他任何数字。只在结果中输出括号内的部分。

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        var pattern = @"(^\d{1,4} - \d{1,4}).*";
        string input = ("1000 - 1009 ABC1 ABC SOMETHING ELSE");
        string replacement = "$1";
        string result = Regex.Replace(input, pattern, replacement);
        Console.WriteLine(result);
    }
}

https://dotnetfiddle.net/cZGlX4