如果关键字前存在number,则删除子字符串

本文关键字:删除 字符串 number 关键字 存在 如果 | 更新日期: 2023-09-27 18:16:30

我有一个字符串的形式:

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

我要做的是删除在等号之前存在的子字符串,但只有当子字符串包含关键字并且该关键字之前的数据是整数时。

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

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

1间中等大小的房子

2个小房子

一鸟=一个鸟笼

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

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;

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

有人能帮我解释一下这个附加的逻辑吗?

像往常一样,非常感谢那些花几分钟阅读这个问题的人。

米克

如果关键字前存在number,则删除子字符串

您可以使用

形式的简单正则表达式来实现。
'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),后面跟着
  • 0个或多个空格's*,后跟
  • 等号=,后面跟着
  • 零或多个空格's*

剩下的很简单:因为这个regex匹配你想要删除的部分,你需要调用Replace并传递string.Empty

演示。

您可以使用regex (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]|是一个"或",因此大写字母和小写字母都匹配。

您可以尝试这样做:

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