首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求:全字匹配替换的正则表达式解决方案

2012-02-01 
求:全字匹配替换的正则表达式求:全字匹配替换的正则表达式例:s+((a+b+c)/d)*ab替换规则:以+-*/()为分隔符

求:全字匹配替换的正则表达式
求:全字匹配替换的正则表达式
例: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   都替换掉。
现在我的困难就在这里,我不知道怎么样在替换的时候进行全字匹配替换。求一个全字匹配的正则表达式

[解决办法]
下面这段代码就是全角转半角的
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();
}
[解决办法]
假如sqlstr存放的字符串为: (a+ab)/abc,那么在替换第一个变量“a”时他会将后面的ab 和abc中的a 都替换掉。
现在我的困难就在这里,我不知道怎么样在替换的时候进行全字匹配替换。求一个全字匹配的正则表达式
--------------------------------------------------
加上\b,表示单词边界
[解决办法]
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也懂正则,仅提供一个思路而已
[解决办法]
-_-#,一行代码就可以搞定的事,为什么要那么麻烦呢?还是说我的理解错误

string yourStr = "((a+b-c)/d)+((s+B)/u)*user ";
string result = Regex.Replace(yourStr, @ "[^+\-*/()]+ ", "select code from text where name = '$0 ' ");

这个测试结果跟你所给结果是一致的
[解决办法]
楼主所贴代码应该不是在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:明天继续断网,晚上才能上,有问题可以给我发站内信

热点排行