这个问题是OceanRain提的,我觉得很有意思,大家看看下面这个帖子的7楼和9楼就知道我的要求了
http://topic.csdn.net/u/20090608/11/6118ebe2-5ed5-4305-9947-d9573a26e764.html?26127这个问题要做,肯定是能解决,但我想不到什么简单和优雅的办法。我这里插入一个话题:
string patern="(a\d+)?(N\d+N)?(KKK\d+)?"
string newStr1="N231N";
string newStr2="KKK34"
newStr1和newStr2是符合patern模式的,我想得到的是它们所满足模式的字符串,即:
(N\d+N)和(KKK\d+) (有没有括号都可以)
跑题了啊,关键看看上面链接中的7楼和9楼
http://topic.csdn.net/u/20090608/11/6118ebe2-5ed5-4305-9947-d9573a26e764.html?26127这个问题要做,肯定是能解决,但我想不到什么简单和优雅的办法。我这里插入一个话题:
string patern="(a\d+)?(N\d+N)?(KKK\d+)?"
string newStr1="N231N";
string newStr2="KKK34"
newStr1和newStr2是符合patern模式的,我想得到的是它们所满足模式的字符串,即:
(N\d+N)和(KKK\d+) (有没有括号都可以)
跑题了啊,关键看看上面链接中的7楼和9楼
{
private string[] groups;
private string source;
public CsToD(string source, string[] groups)
{
this.source = source;
this.groups = groups;
}
public string Update(string newStr)
{
string target = source;
foreach (string g in groups)
{
Match m = Regex.Match(newStr, g);
if (m.Success)
target = Regex.Replace(target, g, m.Value);
}
return target;
}
}
调用:
private void button1_Click(object sender, EventArgs e)
{
string source = "d713s1541s2t0p1000to1500i3m90to110c50m1r0p1.htm";
string[] groups = @"d\d+s\d+ s\d+t\d+ p\d+to\d+ i\d+ m\d+to\d+ c\d+ m\d+ r\d+p\d+".Split();
CsToD ctd = new CsToD(source, groups);
string replace = ctd.Update("p999to999i9m9r9p9");
MessageBox.Show(replace);
}
我这个支持一次更新多个组,而楼主的分组里面有的组无法区分,比如s开头的有多种含义
但是楼主说了,每次只传入一个组,所以这个方法是没有任何问题的
如果每个组都完全不同,同时传入多个组也是能成功的 看各位还有没有更优雅的方式
{
Dictionary<string, Regex> dic = new Dictionary<string, Regex>();
dic.Add("ds", new Regex(@"(?i)d\d+s\d+"));
dic.Add("pto", new Regex(@"(?i)p\d+to\d+"));
dic.Add("m", new Regex(@"(?i)m\d+(?!\d*to)"));
dic.Add("c", new Regex(@"(?i)c\d+"));
dic.Add("p", new Regex(@"(?i)p\d+(?=\.)"));
return dic;
}
Dictionary<string, Regex> pattern = getDic();
Regex reg = new Regex(@"\d+");
private string patternRep(string srcStr, string repStr)
{
string key = reg.Replace(repStr, "");
if (pattern.ContainsKey(key))
{
return pattern[key].Replace(srcStr, repStr);
}
return srcStr;
}
//调用
string test = "d713s1541s2t0p1000to1500i3m90to110c50m1r0p1.htm";
string[] list = new string[] { "d0s22", "p200to500", "m2", "c20" };
foreach (string s in list)
{
test = patternRep(test, s);
}
richTextBox2.Text = test;
http://topic.csdn.net/u/20090608/11/dcb34ca4-17f8-4de9-997f-d2746e2cba6f.html?98233