我有一个表格形式的字符串:
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;
这里的问题是,无论关键字前面的数据是否为数字,我都会删除整个子字符串。
有人能帮我解决这个额外的逻辑吗?
非常感谢任何需要几分钟时间阅读此问题的人。
米克
答案 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
。
答案 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
}
但这仅适用于单位数整数。