如果在关键字之前存在数字,则删除子串

时间:2015-10-06 17:46:31

标签: c# string replace

我有一个表格形式的字符串:

5 dogs = 1 medium size house
4 cats = 2 small houses
one bird = 1 bird cage

我尝试做的是删除等号前面存在的子字符串,但前提是子字符串包含关键字且该关键字之前的数据是整数。

所以在这个例子中我的关键词是:

dogs,
cats,
bird

在上面的例子中,我的过程的理想输出是:

1个中等大小的房子

2个小房子

一只鸟= 1只鸟笼

到目前为止,我的代码看起来像这样(我现在很难对关键字值/字符串进行编码)

var orginalstring= "5 dogs = 1 medium size house";
int equalsindex = originalstring.indexof('=');
var prefix = originalstring.Substring(0,equalsindex);
if(prefix.Contains("dogs")
     {
       var modifiedstring = originalstring.Remove(prefix).Replace("=", string.empty);
       return modifiedstring;
      }
return originalstring;

这里的问题是,无论关键字前面的数据是否为数字,我都会删除整个子字符串。

有人能帮我解决这个额外的逻辑吗?

非常感谢任何需要几分钟时间阅读此问题的人。

米克

3 个答案:

答案 0 :(得分:4)

您可以使用表单

的简单正则表达式来完成
\d+\s+(?:kw1|kw2|kw3|...)\s*=\s*

其中kwX是相应的关键字。

var data = new[] {
    "5 dogs = 1 medium size house",
    "4 cats = 2 small houses",
    "one bird = 1 bird cage"
};
var keywords = new[] {"dogs", "cats", "bird"};
var regexStr = string.Format( @"\d+\s+(?:{0})\s*=\s*", string.Join("|", keywords));
var regex = new Regex(regexStr);
foreach (var s in data) {
    Console.WriteLine("'{0}'", regex.Replace(s, string.Empty));
}

在上面的示例中,string.Format的通话会将|加入的关键字列表粘贴到"模板"在帖子顶部的表达,即

\d+\s+(?:dogs|cats|bird)\s*=\s*

此表达式匹配

  • 一个或多个数字\d+,后跟
  • 一个或多个空格\s+,然后是
  • 列表中的关键字:狗,猫,鸟(?:dogs|cats|bird),后跟
  • 零个或多个空格\s*,然后是
  • 等号=,后跟
  • 零个或多个空格\s*

其余的很简单:由于此正则表达式与您要删除的部分相匹配,因此您需要致电Replace并将其传递给string.Empty

Demo.

答案 1 :(得分:2)

您可以使用正则表达式(System.Text.RegularExpressions)来识别字符串中是否有数字。

Regex r = new Regex("[0-9]"); //Look for a number between 0 and 9
bool hasNumber = r.IsMatch(prefix);

此正则表达式只搜索字符串中的任何数字。如果要搜索数字空格字符串,可以使用[0-9] [a-z]|[A-Z]|是"或"这样大写和小写字母都会产生匹配。

答案 2 :(得分:0)

您可以尝试这样的事情:

int i;
if(int.TryParse(prefix.Substring(0, 1), out i)) //try to get an int from first char of prefix
{
//remove prefix
}

但这仅适用于单位数整数。