Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式从字符串中获取子字符串_C#_Regex - Fatal编程技术网

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();