對於上下文正則表達式,您可以使用zero-width look-around assertions。環視斷言用於斷言某些事情必須是真實的,以便匹配成功,但它們不消耗任何字符(因此「零寬度」)。
在你的情況下,你想使用積極的後視和前瞻斷言。在C#中,你可以做到以下幾點:
static string Replace(string text)
{
return Regex.Replace(
text,
@"(?<=elements\-\((\w+,)*)(\w+),(?=(\w+,)*\w+\))",
"$2 "
);
}
有三個基本部分組成的模式在這裏(按順序):
(?<=elements\-\((\w+,)*)
- 這是肯定的向後看斷言。它表示,只有在文本elements-(
和零個或多個以逗號分隔的字符串之前,模式纔會匹配。
(\w+),
- 這是實際的匹配。這是正在被替換的文本。
(?=(\w+,)*\w+\))
- 這是積極的前瞻斷言。它表示,只有跟隨一個或多個以逗號分隔的字符串時,該模式纔會匹配。
在C#中,匹配內部逗號分隔的內容,則可以選擇執行以下操作:
static string Replace(string text)
{
return Regex.Replace(
text,
@"(?<=elements\-)\(((\w+,)+\w+)\)",
m => string.Format("({0})", m.Groups[1].Value.Replace(',', ' '))
);
}
與正先行斷言的基本方法仍然是相同的。
輸出示例:
"(x,y,z) elements-(a,b) (m,m,m) elements-(c,d,e,f,g,h)"
... ...變得
"(x,y,z) elements-(a b) (m,m,m) elements-(c d e f g h)"
在什麼語言? – 2011-03-18 01:21:52
有人回答你的問題,所以你應該確定他們的答案爲接受。 – Tom 2011-03-18 17:21:52