通过限制输入,在C#中使用正则表达式从字符串中选择特定的出现

时间:2018-10-16 19:46:22

标签: c# .net regex

使用C#,在尝试提取特定字符串同时限制要匹配的字符串时,我陷入了困境。这是我的输入字符串:

  

NPS_CNTY01_10112018_Adult_Submittal.txt

我想在CNTY之后提取01,然后在01之后忽略任何内容。

到目前为止,我的正则表达式为:

(?!NPS_CNTY)\d{2}

但是上面的正则表达式从输入字符串中获得了许多其他数字匹配项。我正在考虑的一种方法是将输入限制为9个字符,最终得到01。但是以某种方式无法实现。任何帮助表示赞赏。

我想补充一点,此输入字符串中唯一的可变数据是:

  

NPS_CNTY [不包括此括号的两位县代码] _ [采用MMDDYYYY格式的日期,不包括括号] _Adult_Submittal.txt。

还请限制正则表达式的解决方案。

2 个答案:

答案 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;
}

请参见.NET regex demo

这里(?<=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();