繁体   English   中英

使用正则表达式仅匹配第 n 次出现

[英]Match only the nth occurrence using a regular expression

我有一个包含 3 个日期的字符串,如下所示:

XXXXX_20160207_20180208_XXXXXXX_20190408T160742_xxxxx

我想选择字符串中的第二个日期,即20180208一个。

是否可以纯粹在regex执行此操作,而必须求助于在代码中提取 2 个匹配项。 如果这很重要,我正在使用C#

感谢您的帮助。

你可以用

^(?:[^_]+_){2}(\d+)

以第一组为例在 regex101.com 上查看演示


崩溃了,这说

var pattern = @"^(?:[^_]+_){2}(\d+)"; 
var text = "XXXXX_20160207_20180208_XXXXXXX_20190408T160742_xxxxx";
var result = Regex.Match(text, pattern)?.Groups[1].Value;
Console.WriteLine(result); // => 20180208

C# 演示

 var pattern = @"^(?:[^_]+_){2}(\\d+)"; var text = "XXXXX_20160207_20180208_XXXXXXX_20190408T160742_xxxxx"; var result = Regex.Match(text, pattern)?.Groups[1].Value; Console.WriteLine(result); // => 20180208

试试这个

MatchCollection 匹配 = Regex.Matches(sInputLine, @"\\d{8}");

字符串 sSecond = 匹配 [1].ToString();

你可以使用正则表达式

^(?:.*?\d{8}_){1}.*?(\d{8})

保存第二个日期以捕获组 1。

演示

自然,对于n > 2 ,将{1}替换为{n-1}以获得第 n日期。 为了获得第1日起使用

^(?:.*?\d{8}_){0}.*?(\d{8})

演示

C# 的正则表达式引擎执行以下操作。

^        # match the beginning of a line
(?:      # begin a non-capture group
  .*?    # match 0+ chars lazily
  \d{8}  # match 8 digits
  _      # match '_'
)        # end non-capture group
{n}      # execute non-capture group n (n >= 0) times
.*?      # match 0+ chars lazily     
(\d{8})  # match 8 digits in capture group 1

需要注意的重要一点是.*? ,后跟\\d{8} ,因为它是懒惰的,将尽可能多地吞噬尽可能多的字符,直到接下来的 8 个字符是数字(并且前面或后面都没有数字。例如,在字符串中

_1234abcd_efghi_123456789_12345678_ABC

(.*?)_\\d{8}_捕获组 1 将包含"_1234abcd_efghi_123456789"

您可以使用System.Text.RegularExpressions.Regex

看下面的例子

Regex regex = new Regex(@"^(?:[^_]+_){2}(\d+)"); //Expression from Jan's answer just showing how to use C# to achieve your goal
GroupCollection groups = regex.Match("XXXXX_20160207_20180208_XXXXXXX_20190408T160742_xxxxx").Groups;
if (groups.Count > 1)
{
    Console.WriteLine(groups[1].Value);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM