使用C#,在尝试提取特定字符串同时限制要匹配的字符串时,我陷入了困境。这是我的输入字符串:
NPS_CNTY01_10112018_Adult_Submittal.txt
我想在CNTY之后提取01,然后在01之后忽略任何内容。
到目前为止,我的正则表达式为:
(?!NPS_CNTY)\d{2}
但是上面的正则表达式从输入字符串中获得了许多其他数字匹配项。我正在考虑的一种方法是将输入限制为9个字符,最终得到01。但是以某种方式无法实现。任何帮助表示赞赏。
我想补充一点,此输入字符串中唯一的可变数据是:
NPS_CNTY [不包括此括号的两位县代码] _ [采用MMDDYYYY格式的日期,不包括括号] _Adult_Submittal.txt。
还请限制正则表达式的解决方案。
答案 0 :(得分:1)
(?!NPS_CNTY)\d{2}
模式与未紧跟NPS_CNTY
的位置匹配,然后匹配2位数字。由于两个数字不能启动NPS_CNTY
字符序列,因此超前总是返回true,这是多余的。
您可以像这样使用正向后方来获得01
:
var m = Regex.Match(s, @"(?<=NPS_CNTY)\d+");
var result = "";
if (m.Success)
{
result = m.Value;
}
这里(?<=NPS_CNTY)
是正向后方,它与紧跟NPS_CNTY
的位置相匹配,然后\d+
匹配1个或多个数字。
使用捕获机制的等效解决方案是
var m = Regex.Match(s, @"NPS_CNTY(\d+)");
var result = "";
if (m.Success)
{
result = m.Groups[1].Value;
}
答案 1 :(得分:1)
如果字符串始终以NPS_CNTY
开头并且必须提取2位数字,则不需要正则表达式。只需使用Substring()
方法:
string text = @"NPS_CNTY01_01141980_Adult_Submittal.txt";
string digits = text.Substring(8, 2);
编辑:
如果您需要在NPS_CNTY
之后匹配N个数字,可以使用以下代码:
string text = @"NPS_CNTY012_01141980_Adult_Submittal.txt";
string digits = text.Replace("NPS_CNTY", string.Empty)
.Split("_", StringSplitOptions.RemoveEmptyEntries)
.FirstOrDefault();