如何使用正则表达式读取字符串之间的第一组数字?

Posted

技术标签:

【中文标题】如何使用正则表达式读取字符串之间的第一组数字?【英文标题】:How to read first set of numbers between strings using regex? 【发布时间】:2021-10-20 17:51:49 【问题描述】:

我有以下字符串,需要提取如下数字:

1) M123123123AD123 => 123123123
2) M1231231212MN23 => 1231231212
3) G12312312312DD => 12312312312

我目前正在使用"\d+[0-9]" 阅读它。如果在第二组字符之后有 1 个数字,则此方法效果很好。但是如果在第二个字符集之后有多个数字,上面的正则表达式字符串也会选择它们。例如,“M123123123AD123”将给出123123123123。但最后的 123 不应该在那里。

【问题讨论】:

我没有看到这个问题。这段代码工作得很好:var regex = new Regex(@"\d+[0-9]"); var input = "M123123123AD123"; var first = regex.Match(input).Value。您应该在问题中发布您的代码。 您的正则表达式应该找到 2 个匹配项,而不是一个与所有数字匹配的项。但也许你想要"(?<=^[GM])\d+" 之类的东西用你期望的任何字母将它锚定到字符串的开头。 这将适用于上述示例:\d+[0-9](?=[A-Z])。但根据之前的 cmets,使用您的版本并进行第一次匹配会更干净。 (这个适用于所有情况,例如M12312312AD2342KX4323(?<=^[A-Z]*)\d+)。这称为后视,前一个是前瞻。 我的回答对你有用吗? 【参考方案1】:

你想在两个字母之间得到一串数字。

你可以使用

(?<=[a-zA-Z])\d+(?=[a-zA-Z])

请参阅.NET regex demo。

或者,如果您想获取前导非数字字符之后的数字,请使用

(?<=^\D+)\d+(?=[a-zA-Z])

见this .NET regex demo。

在C#中,你可以使用Regex.Match:

var result = Regex.Match(text, @"(?<=^\D+)\d+(?=[a-zA-Z])")?.Value;

正则表达式详细信息

(?&lt;=[a-zA-Z]) - 在当前位置之前,必须有一个 ASCII 字母(使用 \pL 匹配任何字母) (?&lt;=^\D+) - 在当前位置之前,必须有字符串开头 + 任意一个或多个非数字字符(如果数字可以出现在字符串开头,请使用 \D*\d+ - 一位或多位数字 (?=[a-zA-Z]) - 在当前位置之后,必须有一个 ASCII 字母(使用 \pL 匹配任何字母)。

【讨论】:

以上是关于如何使用正则表达式读取字符串之间的第一组数字?的主要内容,如果未能解决你的问题,请参考以下文章

关于linux的shell的正则表达式,如何在输入的变量一组字符中提取第一个非数字字符!求解答

redshift sql使用正则表达式从字符串中获取第一、第二、第三个值,如下所示

java 正则正则表达式问题“R8972 M192023(51.1.1)” 查找数据中包含R并且()内第一组数值大于50的数据

只有在字符串中找到一组数字时,C# 正则表达式才匹配

求助:用js正则表达式判断一组数字是否11位且前三位数字不一样。

正则表达式——更多匹配模式