Regex.GroupNameFromNumber

Regex.GroupNameFromNumber

上次用到他是2007年底的事了,今天想要用可是卻想不起來(不知道是不是年紀愈

來愈大了~Orz),所以把它紀錄一次…

 

利用Regex.GroupNameFromNumber可以用群組編號取得群組名稱,這樣可以讓Regular使用

上更彈性一點,我上次和這次都是把群組名稱拿來置換字串。

註:0表全部mapping到的,從1開始是各小群組

範例:


/// 處理特殊tag [b][u][i][sub][sup]
/// </summary>
/// <param name="txtContent"></param>
/// <returns></returns>
private string formatContent(string txtContent)
{
	txtContent = txtContent.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("'","&apos;").Replace("\"", "&quot;");

	string[] patterns = {
							@"(?im).*?(?<r>\[b\](?<b>.*?)\[/b\]).*?",
							@"(?im).*?(?<r>\[u\](?<u>.*?)\[/u\]).*?",
							@"(?im).*?(?<r>\[i\](?<i>.*?)\[/i\]).*?",
							@"(?im).*?(?<r>\[sub\](?<sub>.*?)\[/sub\]).*?",
							@"(?im).*?(?<r>\[sup\](?<sup>.*?)\[/sup\]).*?"
						};
	
	for(int i= 0; i < patterns.Length; i++)
	{
		Regex reg = new Regex(patterns[i]);

		string tag = reg.GroupNameFromNumber(2);
		Match m = reg.Match(txtContent);
		while(m.Success)
		{
			string r = m.Groups["r"].Value;					
			string c = m.Groups[tag].Value;

			txtContent = txtContent.Replace(r, String.Format("<{0}>{1}</{0}>",tag, c));
			m = m.NextMatch();
		}
	}

	return txtContent;
}