2010-07-08 36 views
0

我有一个基本上是c风格的源文件的文本。我需要匹配一个特定的字符,只能在字符串外面说':'。例如:匹配c源代码风格字符串以外的字符

void main() { 
    int x = rand() % 2; 
    printf(x ? "heads : tails" : "tails : heads"); 
    // I want to match this ---^ character, but not others 
} 

对于特异性起见,我使用正则表达式

回答

-1

的.NET风格可以用balancing groups,.NET正则表达式的深度跟踪功能做到这一点。

+0

我想你也可以使用字符串分割方法,只有搜索字符串数组的奇数项返回。偶条目是你试图避免的字符串文字。 – 2010-07-08 01:27:36

+0

字符串不能嵌套,因此不需要跟踪深度。 – 2010-07-10 01:24:10

1

您可以使用正则表达式(如(:)|"[^"\r\n]*")匹配冒号或字符串。使用捕获组来确定冒号是否匹配。迭代此正则表达式的匹配以处理冒号。

Regex regexObj = new Regex("(:)|\"[^\"\r\n]*\""); 
Match matchResults = regexObj.Match(subjectString); 
while (matchResults.Success) { 
    if (matchResult.Groups[1].Success) { 
     // Colon was matched 
    } 
    matchResults = matchResults.NextMatch(); 
} 

请注意,虽然此正则表达式在您的代码示例上正常工作,但它通常不会在C#代码上工作。正则表达式不处理包含转义引号的字符串,不处理逐字字符串,也不会从注释中排除冒号。如果你想所有你需要使用相同的原理展开正则表达式,如:

(:)|string|verbatim string|single line comment|multi line comment