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

解决方案 »

  1.   

    匹配【非字母ABC非字母】,然后取出,判断前后两个字符,符合则替换中间的ABC
      

  2.   


    string pattern = @"(^|[^A-Z]{1,1}|' ')ABC([^A-Z]{1,1}|' '|$)";
    可以取出的值:【ABC)】【 ABC 】【 ABC 】【ABC)】用这个取出字符串,然后再替换里面的ABC为123
      

  3.   

    这样不行哦。
    你可以在http://gskinner.com/RegExr/试一下。
      

  4.   


            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)";
      

  5.   


            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;
            }这样更简单点。
      

  6.   


            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);
            }上面的哪些规则都可以去掉的。
      

  7.   

    真的非常谢谢你,不过这样还是有问题,例如:
    Convert(int,,ABC),被替换成了ABC  
    逗号(,)没有了。
      

  8.   


            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)";
    我这里杂么没有你说的那个问题?说详细一点,给一个复杂一点的试一下。
      

  9.   


    // 之前
    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";
    又测试了这个,貌似没有发现上面问题。
      

  10.   


    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";
    加一个方向就可以了。
      

  11.   

    谢谢,因为我这是要在sql server里面执行,自己又不能改C#的代码,如果一句正则表达式解决不了,那我就可能要折成2条正则表达式来处理。即专门先处理前面有逗号的。
      

  12.   

    试试
     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)
      

  13.   

    TO:Return_false
    你这样基本可以了,但有一种情况我开始没有考虑到:
    ABC)DEF.ABCDEF (ABCD GGGG ABC 900 ABC .ABC Convert(int,ABC)这里有个ABC前面是有小数点的,这种不能替换,请问如何改?谢谢!
      

  14.   

    搞定了:
    (?i)(?<=^|[\s()]|\b[^\.])ABC(?=[\s()]|$)