1.有字符串:'ABC)DEF.ABCDEF (ABCD GGGG ABC 900 ABC Convert(int,ABC)'
要求:
2.1 完全匹配字母ABC
2.2 ABC前面可能为空,也可能有括号,包括左括号(和右括号)
2.3 前面如果有小数点(.)的不能匹配,但前后有空格或括号可以匹配
2.4 不能匹配ABC后面还有字符的,例如不能匹配ABCDE
2.5 Convert(int,ABC)里面的ABC要匹配,但替换的时候仍然只能替换ABC,不能包括前面的逗号和后面的括号
2.6 如果找到了则用123替换
请问正则表达式如何写?谢谢!原来提了一个问题,但没考虑2.5的情况,参见:http://bbs.csdn.net/topics/390552274?page=1#post-395327082
要求:
2.1 完全匹配字母ABC
2.2 ABC前面可能为空,也可能有括号,包括左括号(和右括号)
2.3 前面如果有小数点(.)的不能匹配,但前后有空格或括号可以匹配
2.4 不能匹配ABC后面还有字符的,例如不能匹配ABCDE
2.5 Convert(int,ABC)里面的ABC要匹配,但替换的时候仍然只能替换ABC,不能包括前面的逗号和后面的括号
2.6 如果找到了则用123替换
请问正则表达式如何写?谢谢!原来提了一个问题,但没考虑2.5的情况,参见:http://bbs.csdn.net/topics/390552274?page=1#post-395327082
string pattern = @"(^|[^A-Z]{1,1}|' ')ABC([^A-Z]{1,1}|' '|$)";
可以取出的值:【ABC)】【 ABC 】【 ABC 】【ABC)】用这个取出字符串,然后再替换里面的ABC为123
你可以在http://gskinner.com/RegExr/试一下。
private void button1_Click(object sender, EventArgs e)
{
string str = "ABC)DEF.ABCDEF (ABCD GGGG ABC 900 ABC Convert(int,ABC)";
string pattern = @"(^|[^A-Z]{1,1}|' ')ABC([^A-Z]{1,1}|' '|$)";
MatchCollection collection = Regex.Matches(
str, pattern,
RegexOptions.IgnoreCase |
RegexOptions.ExplicitCapture |
RegexOptions.RightToLeft); foreach (Match m in collection)
{
string s = Combination(m.Value);
str = str.Replace(m.Value, s);
} MessageBox.Show(str);
} private string Combination(string s)
{
string ret = null;
if (s.Length == 5) //有头有尾
{
ret = s[0] + "123" + s[4];
}
else //有头或有尾
{
// 有头
if (s[0] < 'A' && s[0] > 'Z' || s[0] < 'a' && s[0] > 'z')
{
ret = s[0] + "123";
}
else
{
ret = "123" + s[3];
}
}
return ret;
}
只是实现了功能,看是否是你想要的效果.
// 之前
string str = "ABC)DEF.ABCDEF (ABCD GGGG ABC 900 ABC Convert(int,ABC)";
// 之后
string str = "123)DEF.ABCDEF (ABCD GGGG 123 900 123 Convert(int,123)";
private void button1_Click(object sender, EventArgs e)
{
string str = "ABC)DEF.ABCDEF (ABCD GGGG ABC 900 ABC Convert(int,ABC)";
string pattern = @"(^|[^A-Z]{1,1}|' ')ABC([^A-Z]{1,1}|' '|$)";
MatchCollection collection = Regex.Matches(
str, pattern,
RegexOptions.IgnoreCase |
RegexOptions.ExplicitCapture |
RegexOptions.RightToLeft); foreach (Match m in collection)
{
string s = m.Value.Replace("ABC", "123");
str = str.Replace(m.Value, s);
}
textBox1.Text = str;
}这样更简单点。
private void button1_Click(object sender, EventArgs e)
{
string str = "ABC)DEF.ABCDEF (ABCD GGGG ABC 900 ABC Convert(int,ABC)";
string pattern = @"(^|[^A-Z]{1,1}|' ')ABC([^A-Z]{1,1}|' '|$)";
MatchCollection collection = Regex.Matches(str, pattern);
foreach (Match m in collection)
{
string s = m.Value.Replace("ABC", "123");
str = str.Replace(m.Value, s);
}
textBox1.Text = str;
MessageBox.Show(str);
}上面的哪些规则都可以去掉的。
Convert(int,,ABC),被替换成了ABC
逗号(,)没有了。
private string ReplaceString()
{
string str = "ABC)DEF.ABCDEF (ABCD GGGG ABC 900 ABC Convert(int,,ABC)";
string pattern = @"(^|[^A-Z]{1,1}|' ')ABC([^A-Z]{1,1}|' '|$)";
MatchCollection collection = Regex.Matches(str, pattern);
foreach (Match m in collection)
{
str = str.Replace(m.Value, m.Value.Replace("ABC", "123"));
}
return str;
}
这是我所能想到最简化的了。
// 之前
string str = "ABC)DEF.ABCDEF (ABCD GGGG ABC 900 ABC Convert(int,,ABC)";
// 之后
string str = "123)DEF.ABCDEF (ABCD GGGG 123 900 123 Convert(int,,123)";
我这里杂么没有你说的那个问题?说详细一点,给一个复杂一点的试一下。
// 之前
string str = "ABC)DEF(ABC).ABCDEF (ABCD GGGG ABC 900 ABC Convert(int,,ABC)ABC,,,ABC";
// 之后
string str = "123)DEF(123).ABCDEF (ABCD GGGG 123 900 123 Convert(int,,123)ABC,,,123";
又测试了这个,貌似没有发现上面问题。
Convert(int,,123)ABC,,,123";
这个ABC按理来说也是要替换的,刚发现没有替换,可能是因为")"被前面的占用了,后面就没了,这样的话就应该从两边都遍历一下就行。
private string ReplaceString()
{
string str = "ABC)DEF(ABC).ABCDEF (ABCD GGGG ABC 900 ABC Convert(int,,ABC)ABC,,,ABC";
string pattern = @"(^|[^A-Z]{1,1}|' ')ABC([^A-Z]{1,1}|' '|$)";
MatchCollection collection = Regex.Matches(str, pattern, RegexOptions.RightToLeft | RegexOptions.RightToLeft);
foreach (Match m in collection)
{
str = str.Replace(m.Value, m.Value.Replace("ABC", "123"));
}
return str;
}
//string str = "ABC)DEF(ABC).ABCDEF (ABCD GGGG ABC 900 ABC Convert(int,,ABC)ABC,,,ABC";
//string str = "123)DEF(123).ABCDEF (ABCD GGGG 123 900 123 Convert(int,,123)123,,,123";
加一个方向就可以了。
string str = "ABC)DEF.ABCDEF (ABCD GGGG ABC 900 ABC Convert(int,ABC)";
str = Regex.Replace(str, @"(?i)(?<=^|[\s()]|\b)ABC(?=[\s()]|$)", "123");//123)DEF.ABCDEF (ABCD GGGG 123 900 123 Convert(int,123)
你这样基本可以了,但有一种情况我开始没有考虑到:
ABC)DEF.ABCDEF (ABCD GGGG ABC 900 ABC .ABC Convert(int,ABC)这里有个ABC前面是有小数点的,这种不能替换,请问如何改?谢谢!
(?i)(?<=^|[\s()]|\b[^\.])ABC(?=[\s()]|$)