我有一个可以是
的字符串"MyName (ctid 5555)"
或
"OtherName (id 555-5555-5555-555)"
我尝试编写正则表达式来获取ctid
或id
,如下所示:
"(?<=ctid=).+(?=))"
Checking here给出了0个结果。
我的语法有什么问题?
答案 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(.+?)\)
也可以这样做(对于正则表达式初学者来说更具可读性)