求:全字匹配替换的正则表达式
例: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 都替换掉。
现在我的困难就在这里,我不知道怎么样在替换的时候进行全字匹配替换。求一个全字匹配的正则表达式
例: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();
}
现在我的困难就在这里,我不知道怎么样在替换的时候进行全字匹配替换。求一个全字匹配的正则表达式
--------------------------------------------------
加上\b,表示单词边界
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也懂正则,仅提供一个思路而已
smile636(9月的风) ,你说的加上\b,表示单词边界.好像字符需要是以空格来风格的才有效哦
string result = Regex.Replace(yourStr, @"[^+\-*/()]+", "select code from text where name = '$0'");这个测试结果跟你所给结果是一致的
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:明天继续断网,晚上才能上,有问题可以给我发站内信
谢谢,你给我提供的方法,我测试了。你的这个确实是对的
也谢谢各位啦,以后我会努力的。
散分啦