【发布时间】:2013-12-04 03:17:24
【问题描述】:
首先是我正在使用的正则表达式:
String pattern = @"Create(\s+)Table(\s+)(\([a-z0-9]+\))(\s+)Columns(\s+)((\(([a-z0-9]+);(INTEGER|DECIMAL|STRING);(\d{1,3});(((YES|NO);){3})([a-z0-9]+)\))+)";
Match CMD = Regex.Match(Command, pattern, RegexOptions.IgnoreCase);
if (CMD.Success)
{
return true;
}
此正则表达式对以下模式按预期工作:
1) 创建表 (MARKS) 列(fountains;StriNg;999;NO;YES;NO;wicked)(rivers;String;500;NO;YES;NO;sweet)
2) 创建表 (MARKS) 列 (ID;Integer;4;YES;YES;YES;0) (riversString;50;NO;YES;NO;sweet)
在第一个模式中,整个字符串是匹配的,但在第二个模式中,只有子字符串 创建表 (MARKS) 列 (ID;Integer;42;YES;YES;YES;0) 匹配
现在它为以下模式返回 false false:
3)创建表 (MARKS) 列 (IDInteger;42;YES;YES;YES;0) (rivers;String;500;NO;YES;NO;sweet)
第二个模式和第三个模式有相同的错误,但唯一的区别是在第二个模式中匹配 \(([a-z0-9]+);(INTEGER|DECIMAL|STRING) ;(\d{1,3});(((YES|NO);){3})([a-z0-9]+)\) 在字符串结尾之前已经出现并且因此正则表达式返回 true。
现在我的问题是如何告诉拒绝继续匹配直到字符串结尾?
所以基本上是这样的:不是或除了加号(这意味着一个或多个匹配prevoius)我想要=>一个或多个匹配直到行尾。这样,第三个将导致子字符串 Create Table (MARKS) Columns (rivers;String;500;NO;YES;NO;sweet) 来自 Create Table (MARKS) Columns (IDInteger ;42;YES;YES;YES;0) (rivers;String;500;NO;YES;NO;sweet)
【问题讨论】: