正则表达式替换字符串问题

源字符串样例:第一种:100~200第二种:~100第三种:200~我想要替换~100为小于100替换200~为200及以上其他方法自然可以,我是想简便的写出来。但只能写... 源字符串样例:
第一种:100 ~ 200
第二种: ~ 100
第三种:200 ~
我想要替换 ~ 100 为 小于100
替换 200 ~ 为 200及以上

其他方法自然可以,我是想简便的写出来。但只能写到这个程度:
var str = "这里是变量,有可能是以上三种字符串";
str = str.replace(/(^\s*~)/, '小于').replace(/~\s*$/, '及以上');

但我想用的是类似:
str = str.replace(/(^\s*~)(~\s*$)/, function (ch){
if(符合第一组)
return '小于'+ch;
else if (符合第二组)
return ch + '及以上'
else
return ch;
});
但写不成。。。
求指教
展开
 我来答
本逸春vL
2011-09-18 · TA获得超过1567个赞
知道小有建树答主
回答量:812
采纳率:0%
帮助的人:653万
展开全部
<script type="text/javascript">
var str = '100 ~ 200';
str = str.replace(/^\s*(\d*)\s*~\s*(\d*)\s*$/, function (ch,s1,s2){
var rn = '';
if(s1!='') s1 = '小于' + s1;
if(s2!='') s2 = s2 + '及以上';
if(s1!='' && s2!='') rn = ' ~ ';
return s1 + rn + s2;
});
document.writeln(str);
</script>

我解释下ch、s1和s2是怎么来的。
首先,表达式 ^\s*(\d*)\s*~\s*(\d*)\s*$ 是匹配类似 100 ~ 200 、 100 ~ 、 ~ 200 这样的文本的,这个表达式的编写需要你去学习正则表达式了。
所以当表达式匹配到文本的时候,replace函数将会把表达式匹配到的文本,传递到第二个参数的那个函数(也就是这个匿名的函数,函数可以是匿名的,也可以是不匿名的)的第一个参数中,这里第一个参数定义的是名字是 ch 也就是 ch 将接收到整个表达式匹配到的文本(上面的例子将得到“100 ~ 200”这个字符串,我的例子中,这个 ch 完全是无用的,只是用来站位而已,主要是第二个和第三个参数)。
当成参数的这个函数第二个和第三个参数,就是表达式中用圆括号(也就是数学上的小括号。请参考下方给出的连接《正则表达式30分钟入门教程》,我第一次看的时候看了两个小时,后面每隔一段时间看,都有新的收获)括起来的子表达式了,上例 s1 将得到 100 , s2 将得到 200 ,而我对 s1 和 s2 进行的判断,最后拼接字符串,用 return 将最后要替原字符串的新字符串返回给 replace 就可以了。

如果 str 的值是 100 ~ 那么 s1 将会是 100 而 s2 将会是空文本,那么最后 return 的值是 '小于'+s1(也就是“小于100”)。
如果 str 的值是 ~ 200 那么 s1 是空文本 s2 是 200 ,最后 return 的值是 s2+'及以上'(也就是“200及以上”)。
如果是 100 ~ 200 那么就是“小于100 ~ 200及以上”。
更多追问追答
追问
谢谢您详细的解答,不过您的代码结果好像不对。。。
追答
我测试没有问题,能详细说下你所说的不对是哪里吗

参考资料: http://deerchao.net/tutorials/regex/regex.htm

fennng
2011-09-17 · TA获得超过1637个赞
知道大有可为答主
回答量:1892
采纳率:90%
帮助的人:1142万
展开全部
javascript 这样写

var str = '~ 100';

str = str.replace(/^\s*~ (\d+)|(\d+)\s*~\s*$/, function (strMatch, p1, p2)
{
if(p1)
{
return '小于' + p1;
}

return p2 + '及以上'

}
);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
计名pS
2011-09-16 · TA获得超过3649个赞
知道大有可为答主
回答量:4189
采纳率:0%
帮助的人:2194万
展开全部
--你试一下吧,不保证成功:

str = str.replace(/^\s*\d*~\d*\s*$/, function (ch){

var reg1 = /^\s*~(\d+)/
var reg2 = /(\d+)~\s*$/

if (reg1.test(str)) { return '小于'+ $1;}
else if (reg2.test(str)) { return $1 + '及以上' }
else { return ch; });
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户33055
2011-09-16 · TA获得超过487个赞
知道答主
回答量:719
采纳率:0%
帮助的人:387万
展开全部
你的正则没有错...但这属于 Dynamic Regex Replacement 了

python 我是不太会,但你要用正则在查询替代的同时执行code,这个恐怕只有 perl 能够做到...

1. perl -le '$ARGV[0]=~s/(?<!\d)(\d)(?!\d)/$1 x 2/eg; print $ARGV[0]' "5+7+12+32"
## 55+77+12+32

2. perl -le '$ARGV[0]=~s/\b(\d)\b/$1 x 2/eg; print $ARGV[0]' "5+7+12+32"
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
genie2014
2011-09-15 · TA获得超过6488个赞
知道小有建树答主
回答量:1140
采纳率:0%
帮助的人:915万
展开全部
string.replace(regexp/substr,newstring)这个是官方的replace说明,可以看到,第二个参数只能是string类型的,你穿一个function,当然是不行的了
追问
呵呵,可以的。不信试试:
alert("abcde".replace(/.{1}/g, function (ch){
if(ch=='a'){
return 'A';
}else{
return ch;
}
}));
我好像是在 dwr或者prototype源码里面发现的类似写法,还提问过,不过也不是十分明白。
参考:http://zhidao.baidu.com/question/274845400.html
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式