好的,所以在环顾这里之后,我找到了一个满足95%的要求的解决方案,虽然我认为此时可能需要重做。
问题
假设我提供的值范围为" 1000 - 1009 ABC1 ABC SOMETHING ELSE"我只需要1000 - 1009部分。我需要能够从提供的字符串中删除多余的字符,即使它们确实是可接受的字符,但前提是它们是带有文本的辅助字符串的一部分。 (对不起,如果这个描述看起来很奇怪,我今天的思想并不是全力以赴。)
当前解决方案
我目前有一个简单的方法,利用Linq只返回接受的字符,但这将返回" 1000 - 10091"这不是我需要的范围。我已经考虑过使用IsDigit
和IsLetter
对我的优势进行字符串循环并与之前的字符进行比较,但接下来是更换不可接受的字符或删除它们的问题。我想如果我给它一两天,我可以用清醒的头脑解决它,但它需要在一天结束时完成,而我正在敲击键盘。
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?我今天在这个问题上失去了理智。
答案 0 :(得分:4)
为什么不使用正则表达式?
Regex.Match("1000 - 1009 ABC1 ABC SOMETHING ELSE", @"^(\d+)([\s\-]+)(\d+)");
应该给你你想要的东西
答案 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);
}
}