求:全字匹配替换的正则表达式
求:全字匹配替换的正则表达式
例: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:明天继续断网,晚上才能上,有问题可以给我发站内信