我试图提出一个正则表达式,在所有示例中均以粗体显示文本。
在字符串“ JZ”和“-”之前的任何字符之间
JZ123456789-301A
JZ134255872-22013
在字符串“ JZ”和最后一个字符之间
JZ123456789D
我尝试了以下方法,但仅适用于第一个示例
(?<=JZ).*(?=-)
答案 0 :(得分:3)
您可以使用(?<=JZ)[0-9]+
,假设所需的文本始终是数字。
答案 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>
转换为字符串。我认为它更容易阅读。