C# 使用正则表达式从字符串中获取子字符串
我有许多这种格式的字符串:C# 使用正则表达式从字符串中获取子字符串,c#,regex,C#,Regex,我有许多这种格式的字符串: fdg.sdfg.234fdsa.dsf_1.2.5.62.xml 23432ssdfsa_sadfsd_1.2.7.6.xml 3.3.3asdf_ddd_1.2.1.doc 我只想得到号码 from: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\u ddd\u 1.2.1.doc获取:1.2.1 等 此代码
fdg.sdfg.234fdsa.dsf_1.2.5.62.xml
23432ssdfsa_sadfsd_1.2.7.6.xml
3.3.3asdf_ddd_1.2.1.doc
我只想得到号码from:
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\u ddd\u 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-9]+(\.[0-9]+)+(?=\.)
然而,若格式是固定的,那个么正则表达式(和Linq)是超调的
LastIndex
+子字符串
是一个更好的选择。只要您要查找的数字前面有“\ux”,此代码似乎就可以工作
已编辑-这是最终工作结果
// 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();
你已经得到了所有的答案。 我已经6个月没有练习了,几乎都忘了。 无论如何,有很多网站(在你最喜欢的搜索引擎中寻找regex tester)可以帮助你使用regex。我不知道我是否可以多提一个,但这里有一个例子的一些快照(我不是最新的正则表达式专家,所以我希望我没有写得太错) 所以现在你可以测试所有给你的答案和建议了。
.老实说,如果格式是固定的,您可以始终使用uu作为开始和最后一个。最后,只需使用子字符串。对于大多数开发人员来说,读取和维护正则表达式要比读取和维护正则表达式容易得多(是的,正则表达式不是不可能读取的,但是很多开发人员是不可能读取的)。您尝试过任何东西吗?请小心:
表示正则表达式中的任何符号,因此[0-9].[0-9]
将macth,比如说\u1x2
var match=Regex.match(源代码,@“[0-9]+\.[0-9]+\.[0-9]+(\[0-9])*”).ToString().Replace(“,”);另一个问题:\u 1.2.5.62。
无法匹配:它应该是模式中的(\.[0-9]+)*
(请注意+
)抱歉,意外删除了一个“+”。这又是电话线。var match=Regex.match(源代码,@“[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)*”).ToString().Replace(“,”);我唯一要注意的是:值位于字符串的末尾,就在扩展名之前。使用RegexOptions.RightToLeft
以便从右到左解析字符串,这样可以更快地获取正确的匹配项。当然,获取Match对象,并在检查匹配.Success
属性后仅使用.ToString()
。代码中有一个输入错误:字符串模式=@?您选择了错误的工具来理解.NET正则表达式:regex101不支持.NET正则表达式模式。例如\w
与[a-zA-Z0-9]不同
,但与[\p{L}\p{N}\u]
\d
匹配阿拉伯语、印地语和其他数字。请使用Ultrapico Expresso查看.NET子模式的含义。感谢您提醒此陷阱并引用更合适的工具
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);
// 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();