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

C# 如果关键字之前存在数字,则删除子字符串,c#,string,replace,C#,String,Replace,我有一个字符串的形式: 5 dogs = 1 medium size house 4 cats = 2 small houses one bird = 1 bird cage 我试图做的是删除等号之前存在的子字符串,但仅当子字符串包含关键字且该关键字之前的数据是整数时 在这个例子中,我的关键词是: dogs, cats, bird 在上面的示例中,我的流程的理想输出是: 1间中型房屋 2栋小房子 一只鸟=一个鸟笼 到目前为止,我的代码是这样的(我现在正在硬编码关键字值/字符串) 这里的问题是

我有一个字符串的形式:

5 dogs = 1 medium size house
4 cats = 2 small houses
one bird = 1 bird cage
我试图做的是删除等号之前存在的子字符串,但仅当子字符串包含关键字且该关键字之前的数据是整数时

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

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

1间中型房屋

2栋小房子

一只鸟=一个鸟笼

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

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

有人能帮我解释一下这个额外的逻辑吗

非常感谢所有花几分钟来阅读这个问题的人

Mick

您可以使用正则表达式(
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]
|
是一个“或”,因此大写和小写字母都会导致匹配。

您可以使用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]
|
是一个“或”,因此大写和小写字母都会导致匹配。

您可以使用以下形式的简单正则表达式来完成此操作

\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+
    ,后跟
  • 列表中的关键字:狗、猫、鸟
    (?:狗|猫|鸟)
    ,后跟
  • 零个或多个空格
    \s*
    ,后跟
  • 等号
    =
    ,后跟
  • 零个或多个空格
    \s*
剩下的很简单:因为这个正则表达式与您希望删除的部分匹配,所以您需要调用
Replace
并传递它
string.Empty


您可以使用以下形式的简单正则表达式来完成

\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+
    ,后跟
  • 列表中的关键字:狗、猫、鸟
    (?:狗|猫|鸟)
    ,后跟
  • 零个或多个空格
    \s*
    ,后跟
  • 等号
    =
    ,后跟
  • 零个或多个空格
    \s*
剩下的很简单:因为这个正则表达式与您希望删除的部分匹配,所以您需要调用
Replace
并传递它
string.Empty


您可以尝试以下方法:

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

但是,这只适用于一位数整数。

您可以尝试以下方法:

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

但是,这只适用于一位数整数。

嗨,迈克,非常感谢您的快速回复。Regex对我来说有点难以接受,所以如果这是一个天真的问题,请原谅。这个正则表达式只查找关键字前的数字还是任何数字?所以在这种情况下,“5条狗”和“5条狗”会被平等对待吗?我同意Regex有点像野兽。在我的例子中,两者都将被平等对待。您可以将正则表达式更改为
“[0-9][a-z]”
,以匹配“5只狗”,但不匹配“5只狗”(同样,“5只狗”也会失败)。你应该更深入地了解一下正则表达式,它在很多情况下都很有用。@IrishMickeyWard我在答案中添加了一些可能有用的内容。迈克,非常感谢你的帮助,这肯定会帮助我找到需要去的地方!我今天学到了一些东西。嗨,迈克,非常感谢你的快速回复。Regex对我来说有点难以接受,所以如果这是一个天真的问题,请原谅。这个正则表达式只查找关键字前的数字还是任何数字?所以在这种情况下,“5条狗”和“5条狗”会被平等对待吗?我同意Regex有点像野兽。在我的例子中,两者都将被平等对待。您可以将正则表达式更改为
“[0-9][a-z]”
,以匹配“5只狗”,但不匹配“5只狗”(同样,“5只狗”也会失败)。你应该更深入地了解一下正则表达式,它在很多情况下都很有用。@IrishMickeyWard我在答案中添加了一些可能有用的内容。迈克,非常感谢你的帮助,这肯定会帮助我找到需要去的地方!我今天学到了一些东西。显然,正则表达式是海报的新领域。你能详细解释一下为什么你的正则表达式有效吗?布林肯,我真的很感谢你的详细回答和演示。我会试着把它和迈克在下面给我的东西结合起来,看看我是否理解并报告它是如何运作的。如果你有时间,我想解释一下regex,Mikeh和dasblinkenlight……多亏了你的集体投入,我已经有了regex的顿悟。现在一切都如我所希望的那样顺利。我带走了一些好的知识。我将把支票交给dasblinkenlight,因为我从代码中导出了我的解决方案,但也非常感谢你,MikeH。显然Regex是海报的新领域。你能详细解释一下为什么你的正则表达式有效吗?布林肯,我真的很感谢你的详细回答和演示。我会试着把它和迈克在下面给我的东西结合起来,看看我是否理解并报告它是如何运作的