我有一个基本上是c风格的源文件的文本。我需要匹配一个特定的字符,只能在字符串外面说':'。例如:匹配c源代码风格字符串以外的字符
void main() {
int x = rand() % 2;
printf(x ? "heads : tails" : "tails : heads");
// I want to match this ---^ character, but not others
}
对于特异性起见,我使用正则表达式
我有一个基本上是c风格的源文件的文本。我需要匹配一个特定的字符,只能在字符串外面说':'。例如:匹配c源代码风格字符串以外的字符
void main() {
int x = rand() % 2;
printf(x ? "heads : tails" : "tails : heads");
// I want to match this ---^ character, but not others
}
对于特异性起见,我使用正则表达式
的.NET风格可以用balancing groups,.NET正则表达式的深度跟踪功能做到这一点。
您可以使用正则表达式(如(:)|"[^"\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
我想你也可以使用字符串分割方法,只有搜索字符串数组的奇数项返回。偶条目是你试图避免的字符串文字。 – 2010-07-08 01:27:36
字符串不能嵌套,因此不需要跟踪深度。 – 2010-07-10 01:24:10