正则人,来帮个忙

wangxianshou 2010-07-22 11:14:50
replaceLeftChar(“AAABBAAA”,"A","X")
结果:XXXBBAAA
从字符串左端开始替换A成X,不能替换就截止

正则 var reg=/^(A)+/
结果是:XBBAAA
把所有的A替换成了一个X

我想一个A换一个X,有多少个A就换成多少个X
单纯用正则,可以实现吗?

我觉得还是得结合循环来做?

...全文
158 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
-过客- 2010-07-23
  • 打赏
  • 举报
回复
替换的效果是一样的,只不过在待替换字符中出现“(”这类正则中的元字符时,不会报脚本错误了

<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var reg = new RegExp(escape(oldStr) + "+");
return src.replace(reg, function($0){ return (new Array($0.length+1)).join(newStr);});
}
alert(replaceLeftChar("AAABBAAA", "A", "X"));
</script>
-过客- 2010-07-23
  • 打赏
  • 举报
回复
为避免动态拼接正则时可能出现的脚本错误,优化一下

<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var reg = new RegExp(escape(oldStr) + "+");
return src.replace(reg, function($0){ return (new Array($0.length+1)).join(newStr);});
}
alert(replaceLeftChar("AAABBAAA", "(", "X"));
</script>
-过客- 2010-07-23
  • 打赏
  • 举报
回复
try...

<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var reg = new RegExp(oldStr + "+");
return src.replace(reg, function($0){ return (new Array($0.length+1)).join(newStr);});
}
alert(replaceLeftChar("AAABBAAA", "A", "X"));
</script>
wangxianshou 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wangxianshou 的回复:]
我略微改动了下
对应左端:var regSel = new RegExp("^(" + oldStr + ")+");
对应右端:var regSel = new RegExp("(" + oldStr + ")+^");
[/Quote]
对应右端:var regSel = new RegExp("(" + oldStr + ")+$");
-过客- 2010-07-23
  • 打赏
  • 举报
回复
对应左端,也是两种情况,如果你确认要替换的子字符串就在开头,那可以这样
<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var regSel = new RegExp("^(" + oldStr + ")+", "i");
var regSin = new RegExp(oldStr, "ig");
return src.replace(regSel, function($0){ return $0.replace(regSin, newStr);});
}
alert(replaceLeftChar("中国中国ZHONGUO中国中国", "中国", "CHINA"));
</script>


如果不确定,比如待替换内容左侧还可能有一些其它字符,那可以这样
<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var regSel = new RegExp("(" + oldStr + ")+", "i");
var regSin = new RegExp(oldStr, "ig");
return src.replace(regSel, function($0){ return $0.replace(regSin, newStr);});
}
alert(replaceLeftChar("ABC中国中国ZHONGUO中国中国", "中国", "CHINA"));
</script>


替换全部就没什么好说的了,一个g参数就搞定了
<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var reg = new RegExp(oldStr, "ig");
return src.replace(reg, newStr);
}
alert(replaceLeftChar("ABC中国中国ZHONGUO中国中国", "中国", "CHINA"));
</script>
wangxianshou 2010-07-23
  • 打赏
  • 举报
回复
我最简单的却不会了
var regSel = new RegExp(oldChar,"g");
只用这一个就可以了
-过客- 2010-07-23
  • 打赏
  • 举报
回复
对应右端,如果你确认要替换的子字符串就在结尾,那可以这样

<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var regSel = new RegExp("(" + oldStr + ")+$", "i");
var regSin = new RegExp(oldStr, "ig");
return src.replace(regSel, function($0){ return $0.replace(regSin, newStr);});
}
alert(replaceLeftChar("中国中国ZHONGUO中国中国", "中国", "CHINA"));
</script>


如果不确定,比如待替换内容右侧还可能有一些其它字符,那可以这样
<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var regSel = new RegExp("(" + oldStr + ")+(?:(?!" + oldStr + ")[\\s\\S])*$", "i");
var regSin = new RegExp(oldStr, "ig");
return src.replace(regSel, function($0){ return $0.replace(regSin, newStr);});
}
alert(replaceLeftChar("中国中国ZHONGUO中国中国ABC", "中国", "CHINA"));
</script>
wangxianshou 2010-07-23
  • 打赏
  • 举报
回复
全部替换:var regSel = new RegExp("(" + oldStr + ")");
这个不对吗

处理完了,结贴
wangxianshou 2010-07-23
  • 打赏
  • 举报
回复
我略微改动了下
对应左端:var regSel = new RegExp("^(" + oldStr + ")+");
对应右端:var regSel = new RegExp("(" + oldStr + ")+^");

-过客- 2010-07-23
  • 打赏
  • 举报
回复
如果可能还有忽略大小写的需求

<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var regSel = new RegExp("(" + oldStr + ")+", "i");
var regSin = new RegExp(oldStr, "ig");
return src.replace(regSel, function($0){ return $0.replace(regSin, newStr);});
}
alert(replaceLeftChar("中国中国ZHONGUO", "中国", "CHINA"));
</script>
-过客- 2010-07-23
  • 打赏
  • 举报
回复
呵呵,当时是按一个字符考虑的

<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var regSel = new RegExp("(" + oldStr + ")+");
var regSin = new RegExp(oldStr, "g");
return src.replace(regSel, function($0){ return $0.replace(regSin, newStr);});
}
alert(replaceLeftChar("中国中国ZHONGUO", "中国", "CHINA"));
</script>
兔子-顾问 2010-07-23
  • 打赏
  • 举报
回复
过客 v5
wangxianshou 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lxcnn 的回复:]
引用 17 楼 wangxianshou 的回复:
从你的例子上,没问题
对于任意的字符还是有点问题,比如
alert(replaceLeftChar("中国ZHONGUO", "中国", "CHINA"));
处理不了


如果这样的话,就不能用escape处理元字符了,因为它会把中文编码,如果要处理这个异常,需要自己另写函数了


JScript code
<script……
[/Quote]
alert(replaceLeftChar("中国中国ZHONGUO", "中国", "CHINA"));
只能替换第一个中国,第二个中国不能替换
从左端开始替换,连续的替换,直至不能替换,中间断层后就中止
-过客- 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zswang 的回复:]
有正则的地方就有过客的身影。
[/Quote]

就这点爱好。。。
-过客- 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wangxianshou 的回复:]
从你的例子上,没问题
对于任意的字符还是有点问题,比如
alert(replaceLeftChar("中国ZHONGUO", "中国", "CHINA"));
处理不了
[/Quote]

如果这样的话,就不能用escape处理元字符了,因为它会把中文编码,如果要处理这个异常,需要自己另写函数了

<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var regSel = new RegExp(oldStr + "+");
var regSin = new RegExp(oldStr);
return src.replace(regSel, function($0){ return $0.replace(regSin, newStr);});
}
alert(replaceLeftChar("中国ZHONGUO", "中国", "CHINA"));
</script>
wangxianshou 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lxcnn 的回复:]
引用 9 楼 wangxianshou 的回复:
对应一个字符替换可以,我想两个或者多个为一个整体的时候,就不能替换了


上面用的new Array($0.length+1)).join(newStr)确实只适用于一个字符
看下这样是不是你要的效果

JScript code
<script type="text/javascript">
function repla……
[/Quote]

从你的例子上,没问题
对于任意的字符还是有点问题,比如
alert(replaceLeftChar("中国ZHONGUO", "中国", "CHINA"));
处理不了
wangxianshou 2010-07-23
  • 打赏
  • 举报
回复
顺便问下一个数据的精度问题
alert(Number("9999999999999.999000000004"));
alert(Number("99999999999999.99999999999"));

我想原封不动的转换为数字,但是出来的结果却发生了变化
能使它不变化吗

可能是数太大了。。。
-过客- 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wangxianshou 的回复:]
对应一个字符替换可以,我想两个或者多个为一个整体的时候,就不能替换了
[/Quote]

上面用的new Array($0.length+1)).join(newStr)确实只适用于一个字符
看下这样是不是你要的效果
<script type="text/javascript"> 
function replaceLeftChar(src, oldStr, newStr)
{
var regSel = new RegExp(escape(oldStr) + "+");
var regSin = new RegExp(escape(oldStr));
return src.replace(regSel, function($0){ return $0.replace(regSin, newStr);});
}
alert(replaceLeftChar("AAABBAAA", "AA", "XX"));
</script>
/*-------输出--------
XXABBAAA
*/
wangxianshou 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lxcnn 的回复:]
引用 9 楼 wangxianshou 的回复:
对应一个字符替换可以,我想两个或者多个为一个整体的时候,就不能替换了


给个例子看看
[/Quote]

replaceLeftChar("AAABBAAA", "AA", "X") 结果:XABBAAA
replaceLeftChar("AAABBAAA", "AAA", "X") 结果:XBBAAA

顺便写个右端处理的,呵呵
王集鹄 2010-07-23
  • 打赏
  • 举报
回复
有正则的地方就有过客的身影。
加载更多回复(9)

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧