C# 正则表达式到 NSRegularExpression
本文关键字:NSRegularExpression 正则表达式 | 更新日期: 2023-09-27 18:37:18
>我有以下正则表达式,它为我获取创建索引语句的表名和列详细信息:
Regex r = new Regex(@"create's*index.*?'son's*'[?(?<table>['s'w]*'w)']?'s*'((?:(?<cname>['s'd'w'[']]*),?)*')", RegexOptions.Compiled | RegexOptions.IgnoreCase);
我想在Objective-C中使用它。我尝试了以下方法:
NSError * error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: @"create''s*index.*?''son''s*''[?([''s''w]*''w)'']?''s*''((?:([''s''d''w''['']]*),?)*'')"
options: NSRegularExpressionCaseInsensitive | NSRegularExpressionSearch
error: &error];
if(nil != error)
{
NSLog(@"Error is: %@. %@", [error localizedDescription], error);
}
NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString: createStatement options:0 range: NSMakeRange(0, [createStatement length])];
NSArray *matches = [regex matchesInString: createStatement
options: 0
range: NSMakeRange(0, [createStatement length])];
这部分有效。它给了我三个范围。第一个包含整个字符串,第二个包含表名。问题是第三个是空的。
有人知道我哪里出错了?
编辑:我尝试解析的字符串是:创建索引卡设置索引在[卡]上(cardSetId ASC)
您似乎遇到的问题是第二个捕获组被(?: )*
的最后一次迭代覆盖。由于它是可选的,所以它总是空白的。
您的正则表达式:
create's*index.*?'son's*
'[?
( ['s'w]*'w )
']?'s*
'(
(?:
( ['s'd'w'[']]* )
,?
)*
')
将其更改为:
create's*index.*?'son's*
'[?
( ['s'w]*'w )
']?
's*
'(
(
(?: ['s'd'w'[']]* ,? )*
)
')
压缩和转义:
create''s*index.*?''son''s*''[?([''s''w]*''w)'']?''s*''(((?:[''s''d''w''['']]*,?)*)'')
你的问题对你真正想要抓取的东西有点模糊,而且正则表达式非常粗糙,所以我无法从中收集到它。
CREATE's*INDEX's*('w+)'s*ON's*('['w+'])'s*'((.+)')
这将获取组 1 中的表名、组 2 中的 ON 属性以及组 3 中的以下属性。