字符串和最后一位数字之间的正则表达式匹配

时间:2018-06-20 22:41:01

标签: c# regex

我试图提出一个正则表达式,在所有示例中均以粗体显示文本。

在字符串“ JZ”和“-”之前的任何字符之间

JZ123456789-301A
JZ134255872-22013

在字符串“ JZ”和最后一个字符之间

JZ123456789D

我尝试了以下方法,但仅适用于第一个示例

(?<=JZ).*(?=-)

3 个答案:

答案 0 :(得分:3)

您可以使用(?<=JZ)[0-9]+,假设所需的文本始终是数字。

Try it out here

答案 1 :(得分:1)

您可以使用

JZ([^-]*)(?:-|.$)

并获取组1的值。参见regex demo

详细信息

  • JZ-文字子字符串
  • ([^-]*)-捕获组1:-以外的零个或多个字符
  • (?:-|.$)-一个非捕获组,匹配字符串末尾的-或任何char

C#代码:

var m = Regex.Match(s, @"JZ([^-]*)(?:-|.$)");
if (m.Success)
{
    Console.WriteLine(m.Groups[1].Value);
}

如果由于某种原因需要整体获取所需的值,请使用环顾四周:

(?<=JZ)[^-]*(?=-|.$)

请参见this regex variation demo。在上面的代码中使用m.Value来获取值。

答案 2 :(得分:0)

没有正则表达式的单行答案:

string s,r;

// if your string always starts with JZ
s = "JZ123456789-301A";
r = string.Concat(s.Substring(2).TakeWhile(char.IsDigit));
Console.WriteLine(r); // output : 123456789

// if your string starts with anything
s = "A12JZ123456789-301A";
r = string.Concat(s.Substring(s.IndexOf("JZ")).TakeWhile(char.IsDigit));
Console.WriteLine(r); // output : 123456789

基本上,我们删除定界符“ JZ”之前和包括的所有内容,然后在每个字符为数字的同时取它们。 Concat用于将IEnumerable<char>转换为字符串。我认为它更容易阅读。

Try it online