我需要一个正则表达式模式,用于删除特定位置的某些数字。
我的字符串格式如下:xxxx - 2013-xxxxxx9 xxxxxxxx9
,字符串中的'9'表示数字或不存在。
我写的代码是这样的:
string str= "dddd - 2013-0Winter1 morning2";
Regex pattrn = new Regex(".* - ([0-9]{4}-).*([1-9]?) .*([1-9]?)$");
Match match = pattern.Match(me);
for (int index = match.Groups.Count - 1; index > 0; index--)
{
str = str.Remove(match.Groups[index].Index, match.Groups[index].Length);
}
运行时,match.Groups[2]
和match.Groups[3]
的值为空。但我希望在字符串中找到“2013
”,“1
”和“2
”。
结果是:
"dddd - 0Winter1 morning2";
我想要的结果是:
"dddd - 0Winter morning";
有人知道为什么吗?
答案 0 :(得分:2)
问题是你的.*
是贪婪的,因此它会吞噬它之后的([1-9]?)
。如果您使用non-greedy quantifier(.*?
),您将获得所需的结果:
string str = "dddd - 2013-0Winter1 morning2";
Regex pattern = new Regex("^.* - ([0-9]{4}-).*?([1-9]?) .*?([1-9]?)$");
Match match = pattern.Match(str);
for (int index = match.Groups.Count - 1; index > 0; index--)
{
str = str.Remove(match.Groups[index].Index, match.Groups[index].Length);
}
Console.WriteLine(str); // dddd - 0Winter morning
当然,这会产生相同的结果:
string str = "dddd - 2013-0Winter1 morning2";
str = Regex.Replace(str, @"^(\w*? [0-9]{4}-\w*?)[1-9]? (\w*?)[1-9]?$", "$1 $2");
Console.WriteLine(str); // dddd - 0Winter morning