2017-08-07 130 views
-1

我有一个字符串"offerDate(1,30)"。我必须检查我的字符串是否以"offerDate"开头,如果这个条件是真的,我必须从字符串中提取1和30。任何人都可以帮助我。提前致谢。正则表达式字符串“offerDate(1,30)”

我的代码是

System.Text.RegularExpressions.Regex.Matches("StingToBePassed",@"\d+") 
    .Cast<Match>() 
    .Select(x => Convert.ToInt16(x.Value)) 
    .ToList(); 
+0

请说明您当前的代码有什么问题 –

+0

我只是想检查我的字符串是否以“offerDate”开头。如果它是真的,那么只有我需要存储这个数字。当前的代码提取数字并存储在列表中,但是它不检查字符串是否以“OfferDate”开头 –

+0

要澄清,“StringToBePassed”可以包含'offerDate(1,30)'的_多个实例吗?我更新的答案假定您使用'Match'的倍数,但如果这个假设是错误的,我可以恢复到我的原始版本,它只解析一个实例。 –

回答

0

您可以使用组来提取较大的图案的特定部分。你的情况:

offerDate\((\d+),(\d+)\) 

然后您可以封装成函数:

static IEnumerable<Range> ParseOfferDateRanges(string input) 
{ 
    var matches = Regex.Matches(input, @"offerDate\((\d+),(\d+)?\)"); 

    return matches 
     .Cast<Match>() 
     .Select(ParseOfferDateMatch) 
     .ToList(); 
} 

static Range ParseOfferDateMatch(Match match) 
{ 
    var fromValue = match.Groups[1].Value; 
    var toGroup = match.Groups[2]; 

    var to = toGroup.Success 
     ? short.Parse(toGroup.Value) 
     : (short?)null; 

    return new Range() 
    { 
     From = short.Parse(fromValue), 
     To = short.Parse(toValue) 
    }; 
} 

我假设你有一个Range结构,看起来像以下,但在C#7,你还可以返回一个元组:

public struct Range 
{ 
    public short From; 
    public short? To; 
} 
+0

非常感谢。这是我想要的同样的事情。 –

+0

没问题。如果它回答了你的问题,你可以点击我的答案上的“打勾”,它会将你的问题标记为“已回答”。 –

+0

感谢您的帮助。但是,是否有可能将第二个参数设置为可选。我的意思是如果提供字符串“OfferDate(1,)”,那么它也与条件匹配。我们绝对可以使用两个正则表达式,但我希望它使用单个表达式 –

0

你可以尝试用积极的回顾后功能模式:

(?<=offerDate\((\d+,)?)\d+

注意:您必须使用regex.Matches(而不仅仅是Match)才能工作。