我有一個基本上是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