C# 正则表达式匹配最后一个下划线后的最后一个数字

Posted

技术标签:

【中文标题】C# 正则表达式匹配最后一个下划线后的最后一个数字【英文标题】:C# Regex match the last digit after the last underscore 【发布时间】:2021-09-07 11:58:42 【问题描述】:

使用正则表达式,我试图只获取最后一个下划线之后的最后一个数字(只能是 2 或 3)。

我现在拥有的是获取数字和字符。 我需要切断字符,只得到数字[2-3]。

这是我的例子——我只需要在最后一个下划线之后得到 2。目前正在获取数字和字符

ABC_0000_DEFG_1I_23_45_HIJKL2.pdf
The output I want -- 2 (after HIJKL).

^.*_\K[^.]+

If I get rid of ^ with \d, d2-3, ... it still gets HIJKL.

【问题讨论】:

字符串模式 = @"\d";字符串输入=“ABC_0000_DEFG_1I_23_45_HIJKL2.pdf”;匹配匹配 = Regex.Match(输入, 模式, RegexOptions.RightToLeft);字符串结果 = match.Value; 模式不是静态的,它可以变化。这只是一个例子。 从右到左搜索模式得到第一位。 【参考方案1】:

正则表达式

_[^_]*([2-3])[^_]*$

你应该这样做。它匹配:

_ — 下划线,后跟 [^_]* — 除下划线以外的零个或多个字符,后跟 ([23]) — 十进制数字 23,后跟 [^_]* — 除下划线以外的零个或多个字符,后跟 $ — 正文结束

你需要得到匹配组#1:

var rx = new Regex(@"_[^_]*([2-3])[^_]*$");
var m  = rx.Match("ABC_0000_DEFG_1I_23_45_HIJKL2.pdf");
var s  = m.Success ? m.Groups(1) : null;

此时,s 应该是“2”。

【讨论】:

输出是 _HIJKL2.pdf 我只需要 2 个 您必须捕获您想要的位并通过Match.Groups 引用它。请参阅修改后的答案。 谢谢!刚刚使用 Groups[1] 来获得我想要的输出。也接受了你的回答。我还有一个问题.. 如果我有一个包含字符和十进制数字的字符串.. 例如) blah(space)blah(space)blah(space)11.11%(space)22.22%(space)33.33%(space) 44.44%(space)55.55% 等等...(可能有更多数字)有没有办法在没有使用正则表达式的情况下获得最高小数?还是我必须分裂并得到我想要的结果? 这是一个不同的问题......你应该单独问。 没关系。不过还是谢谢。【参考方案2】:

你可以使用

_[^_]*(\d)[^_]*$

与最后一个下划线匹配,后跟一个被除下划线以外的任何内容包围的数字。

如果您想忽略除23 以外的任何内容,您可以使用[23] 而不是\d

【讨论】:

在最后一个下划线之后仍然打印出整个文本 您需要使用捕获组,如您接受的答案中所述。【参考方案3】:

要仅在 .NET 中获得匹配,您还可以使用环视:

(?<=_[^_]*)[23](?=[^_]*$)

模式匹配:

(?&lt;=_[^_]*) 正向后视,断言_ 后跟_ 以外的可选字符 [23] 匹配 2 或 3 (?=[^_]*$) 积极的前瞻断言没有 _ 直到字符串的末尾

查看.NET regex demo 或C# demo。

示例代码

Regex regex = new Regex(@"(?<=_[^_]*)[23](?=[^_]*$)");
Match match = regex.Match("ABC_0000_DEFG_1I_23_45_HIJKL2.pdf");
if (match.Success)

    Console.WriteLine(match.Value);

输出

2

【讨论】:

以上是关于C# 正则表达式匹配最后一个下划线后的最后一个数字的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

python之正则表达式

数据之路 - Python爬虫 - 正则表达式

C# 正则表达式

Python-正则表达式总结版

常见的爬虫分析库-Python正则表达式与re模块