求:全字匹配替换的正则表达式
例:s+((a+b+c)/d)*ab
替换规则:以+-*/()为分隔符
现象效果: 在替换a 时不要将后面的ab中的a也提换掉了。
//---------------
下面是我的写的代码:实现功能将一个算术式转化成sql语句:
例如一个算式:((a+b-c)/d)+((s+B)/u)*user(其中的字符都是变量),我现在要将其中被+-*/还有括号风格开的字符替换成一个sql语句,而sql语句的条件就是变量。
替换结果:例如:a 被替换为 select code from text where name = 'a';b 被替换为 select code from text where name ='b',后面的依次类推。
最后这个算式将被替换为:
((select code from text where name='a'+select code from text where name='b'-select code from text where name='c')/select code from text where name='d')+
((select code from text where name='s'+select code from text where name='B')/select code from text where name='u')*select code from text where name='user'//引用就不写了,下面是我写的程序
//编写语言为c#,中间不用考虑被除数为0,算式中的变量只会由字母和数字组成,不用考虑大小写。//转化为sql
private string ChangeSql(string name)
{
 string sql="select code from text where name='"+ name +"'";
 return sql;
}
//转化算术式
private string GetSql(string Arithmetic)
{
  StringBuilder sqlstr = new StringBuilder();
  sqlstr.Append(Arithmetic);
  string[] sss = Regex.Splite(sqlstr.Tostring(),[\\+\\-\\*\/\\(\\)]); //存放被+ - * / ( )分割的变量
  string[] kkk = new string[sss.Lenght]; // 存放转化后的sql用于替换公式中的变量
  int i=0;
  foreach(string u in sss)
  {
   kkk[i]=ChangeSql(u);//调用转化为sql的函数并保存到kkk数组中
   i++; 
  }
  i=0;
  
  foreach(string t in sss) //将变量替换为“[ 数字 ]”,用于下面替换sql好定位
  {
   sqlstr.Replace(t,"["+ i +"]");
   i++;
  }  sss =  Regex.Splite(sqlstr.Tostring(),[\\+\\-\\*\/\\(\\)]); //存放被+ - * / ( )分割的变量;  i=0;  foreach(string h in sss) //替换变量为sql
  {
  sqlstr.Replace("["+ i +"]" , kkk[i]);
  i++;
  } return sqlstr.Tostring();  
}上面的代码错误在这个位置:
  i=0;
  
  foreach(string t in sss) //将变量替换为“[ 数字 ]”,用于下面替换sql好定位
  {
   sqlstr.Replace(t,"["+ i +"]");
   i++;
  }
假如sqlstr存放的字符串为: (a+ab)/abc,那么在替换第一个变量“a”时他会将后面的ab 和abc中的a 都替换掉。
现在我的困难就在这里,我不知道怎么样在替换的时候进行全字匹配替换。求一个全字匹配的正则表达式

解决方案 »

  1.   

    下面这段代码就是全角转半角的   
      public   static   string   CharConverter(string   source)   
      {   
      System.Text.StringBuilder   result   =   new   System.Text.StringBuilder(source.Length,   source.Length);   
      for   (int   i=0;   i<source.Length;   i++)   
      {   
      if   (source[i]   >=   65281   &&   source[i]   <=   65373)   
      {   
      result.Append((char)(source[i]   -   65248));   
      }   
      else   if   (source[i]   ==   12288)   
      {   
      result.Append('   ');   
      }   
      else   
      {   
      result.Append(source[i]);   
      }   
      }   
      return   result.ToString();   
      }
      

  2.   

    假如sqlstr存放的字符串为: (a+ab)/abc,那么在替换第一个变量“a”时他会将后面的ab 和abc中的a 都替换掉。
    现在我的困难就在这里,我不知道怎么样在替换的时候进行全字匹配替换。求一个全字匹配的正则表达式
    --------------------------------------------------
    加上\b,表示单词边界
      

  3.   

    string pattern = @"(?<obj>\w+)";
        Regex rgx = new Regex(pattern);    string inputStr = "s+((a+b+c)/d)*ab";
        rgx.replace(inputStr,pattern,"select code from text where name='${obj}'");${obj} 换成 $1 也应该可以以上代码没经过测试
    LZ也懂正则,仅提供一个思路而已
      

  4.   

    好的,我星期一到公司测试一下,今天忙了一天了,谢谢dracula1133() 
    smile636(9月的风) ,你说的加上\b,表示单词边界.好像字符需要是以空格来风格的才有效哦
      

  5.   

    -_-#,一行代码就可以搞定的事,为什么要那么麻烦呢?还是说我的理解错误string yourStr = "((a+b-c)/d)+((s+B)/u)*user";
    string result = Regex.Replace(yourStr, @"[^+\-*/()]+", "select code from text where name = '$0'");这个测试结果跟你所给结果是一致的
      

  6.   

    楼主所贴代码应该不是在VS下写的吧,有很多错误的说,比如Tostring应该是ToString测了一下楼主的代码,还是不明白为什么楼主会有这样的思路按楼主的思路,有几处需要改动1、
    string[] sss = Regex.Splite(sqlstr.Tostring(),[+\-*/()]); 
    ---->
    string[] sss = Regex.Split(Regex.Replace(sqlstr.ToString(), "^[+\-*/()]*|[+\-*/()]*$", ""), "[+\-*/()]+"); 
    这里需要做下预处理,去掉开始和结束位置的+-*/(),否则你得到的字符串数组里有空值,导致结果错误,用你第二个例子试下就知道了
    2、
    sqlstr.Replace(t,"["+ i +"]");
    --->
    sqlstr = new StringBuilder(Regex.Replace(sqlstr.ToString(), @"\b" + t + @"\b", "[" + i + "]"));
    这样才是全字匹配替换
    3、
    sss = Regex.Split(sqlstr.ToString(), "[\\+\\-\\*\\/\\(\\)]+"); 
    这行删除
    4、
    还有那几个带i++的foreach,既然用了递增变量,用for循环就是了
    5、
    正则中,[]内只有“[”和“]”两个字符是必须转义的,再就是“-”根据所在位置不同,有时需要转义,其实的都可以不用转义的
    给你提出这些错误改正方法,并不是提倡用你所写的方法,只是提醒你以后写代码时注意一下这些问题^o^PS:明天继续断网,晚上才能上,有问题可以给我发站内信
      

  7.   

    TO:lxcnn(过客) 
    谢谢,你给我提供的方法,我测试了。你的这个确实是对的
    也谢谢各位啦,以后我会努力的。
    散分啦