我有很多这种格式的字符串:
fdg.sdfg.234fdsa.dsf_1.2.5.62.xml
23432ssdfsa_sadfsd_1.2.7.6.xml
3.3.3asdf_ddd_1.2.1.doc
我想只得到号码
来自:fdg.sdfg.234fdsa.dsf_1.2.5.62.xml
获取:1.2.5.62
来自:f23432ssdfsa_sadfsd_1.2.7.6.xml
获取:1.2.7.6
来自:f3.3.3asdf_ddd_1.2.1.doc
获取:1.2.1
等
此代码有效:
string test = "4534534ghgggg_1.1.3.4.xml";
int to = test.LastIndexOf('.');
int from = test.LastIndexOf('_') + 1;
Console.WriteLine(test.Substring(from,to - from));
但我想知道怎样才能用正则表达式做到这一点。有什么想法吗?
答案 0 :(得分:2)
首先,让我们详细说明匹配的规则(数字不是你想得到的):
然后实现一个模式:
(?<=_)[0-9]+(\.[0-9]+)+(?=\.)
如果问题中的数字实际上是某种版本,您可能想要重写其部分的数量,例如
(?<=_)[0-9]+(\.[0-9]+){1,3}(?=\.[^0-9])
表示只接受2到4个版本(_d.d.
,_d.d.d.
和_d.d.d.d.
)。例如。当_1.2.15.
被拒绝时,将接受输入1
(3个部分:2
,15
和_1.2.3.4.5.
)
最后,使用正则表达式:
string source = ...
string pattern = @"(?<=_)[0-9]+(\.[0-9]+)+(?=\.)";
// If there are many matches, let's take the last one
string lastMatch = Regex.Matches(pattern, source)
.OfType<Match>()
.Select(match => match.Value)
.LastOrDefault();
Console.Write(lastMatch);
但是,如果格式已修复,则正则表达式(和 Linq )会超调。 LastIndex
+ Substring
是更好的选择。
答案 1 :(得分:2)
只要您要查找的数字前面带有“_”,此代码就可以正常工作。
已编辑 - 这是最终的工作结果
// fdg.sdfg.234fdsa.dsf_1.2.5.62.xml
// 23432ssdfsa_sadfsd_1.2.7.6.xml
// 3.3.3asdf_ddd_1.2.1.doc
string source = "fdg.sdfg.234fdsa.dsf_1.2.5.62.xml";
var match = Regex.Match(source, @"_[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)*").ToString().Replace("_", "");
Console.WriteLine(match);
Console.ReadLine();
答案 2 :(得分:1)
你已经得到了所有答案。 我在过去的6个月里没有练习,几乎都忘记了。 无论如何,有很多网站(在你最喜欢的搜索引擎中寻找正则表达式测试器)可以帮助你使用正则表达式。我不知道我是否可以提到一个比另一个更多但是这里有一个例子的快照(我不是正则表达式的最新专家所以我希望我没有写错的东西)。
所以现在你可以测试所有给你的答案和建议。