Match.Regex语法

时间:2012-04-03 15:14:39

标签: c# regex

我有一个可以是

的字符串
"MyName (ctid 5555)"

"OtherName (id 555-5555-5555-555)"

我尝试编写正则表达式来获取ctidid,如下所示:

"(?<=ctid=).+(?=))"

Checking here给出了0个结果。

我的语法有什么问题?

5 个答案:

答案 0 :(得分:1)

尝试此模式:(?<=\((?:ctid|id)\s).+?(?=\))

它使用后视检查“ctid”或“id”后跟空格,然后匹配任何内容直到右括号。

string[] inputs = { "MyName (ctid 5555)", "OtherName (id 555-5555-5555-555)" };
string pattern = @"(?<=\((?:ctid|id)\s).+?(?=\))";

foreach (var input in inputs)
{
    var result = Regex.Match(input, pattern).Value;
    Console.WriteLine(result);
}

如果您澄清了您的问题,可能会有更好的解决方案。如果您想知道该值是“ctid”还是“id”,则可以使用命名的捕获组。

答案 1 :(得分:1)

根据您的示例,我假设您需要正则表达式来明确匹配

try
{
    var idRegEx = "^.*?\s\(id\s(\d{3}-\d{4}-\d{4}-\d{3})\)$";
    var ctIdRegex = "^.*?\s\(ctid\s(\d{4})\)$";

    var idMatch = Regex.Replace(textToTest, idRegEx, RegexOptions.IgnoreCase).Groups[1].Value;
    var ctIdMatch = Regex.Replace(textToTest, ctIdRegex , RegexOptions.IgnoreCase).Groups[1].Value;
}
catch(ArgumentException)
{
   // Regex is wrong
}
catch(ArgumentOutOfRangeException)
{
   // No match found on one or the other
}

答案 2 :(得分:0)

好吧,你正在寻找'ctid ='并且字符串有'ctid'。您还需要在前瞻中转义括号(将')'更改为'\)'

答案 3 :(得分:0)

假设一个ctid总是4位数,并且id总是3-4-4-3位数,并且无论哪种方式都包含在圆括号中,我会这样做:

\((?:ctid (?<ctid>\d{4})|id (?<id>\d{3}-\d{4}-\d{4}-\d{3}))\)

这会添加命名组并同时进行有效性检查。例如,您可以使用match.Groups['ctid'].value获取ctid值,或使用['id']获取ID值。因为有效性检查,你永远不会得到(我假设的是)像“(id 123)”这样的无效ID(因为它没有3-4-4-3模式)。

答案 4 :(得分:0)

不确定您想要什么完全

(?:(ct)?id)\s(.+?)\)

但这个正则表达式对我有用

http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

你只需抓住第二组......

如果你真的不想看看正则表达式,那么

\((ct)?id\s(.+?)\)

也可以这样做(对于正则表达式初学者来说更具可读性)