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])
— 十进制数字 2
或 3
,后跟
[^_]*
— 除下划线以外的零个或多个字符,后跟
$
— 正文结束
你需要得到匹配组#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)[^_]*$
与最后一个下划线匹配,后跟一个被除下划线以外的任何内容包围的数字。
如果您想忽略除2
或3
以外的任何内容,您可以使用[23]
而不是\d
。
【讨论】:
在最后一个下划线之后仍然打印出整个文本 您需要使用捕获组,如您接受的答案中所述。【参考方案3】:要仅在 .NET 中获得匹配,您还可以使用环视:
(?<=_[^_]*)[23](?=[^_]*$)
模式匹配:
(?<=_[^_]*)
正向后视,断言_
后跟_
以外的可选字符
[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# 正则表达式匹配最后一个下划线后的最后一个数字的主要内容,如果未能解决你的问题,请参考以下文章