[HELP] JS 正则表达式 只有 向前查找,向后查找 咋整?!

yixianggao 2009-08-13 12:07:42
var s = "This is a {0}, test {{0} {1}.";
本想只匹配红色 {0},而不匹配 {{0},但费了半天劲儿,也没写出来,一查才发现 js 不支持 向后查找!

有人提出将字符串和表达式反转后,再应用向前查找。

各位高手有啥妙招没?!

还有就是 js 为啥不支持向后查找呢?!
...全文
714 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
s_liangchao1s 2009-08-13
  • 打赏
  • 举报
回复

//没办法喽..但有特定环境,正向预搜索可以基本搞定...
yixianggao 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 s_liangchao1s 的回复:]
var s="This is a {0}, test {{0} {1}.";
var reg=/[^{](?=\{0\})\{0\}/;//这样也不能算特例其实,,
alert(s.match(reg)[0].length); // 4,因为包含了前导空格
[/Quote]
其实最好就是用 负向后查找 (?<!),但是 js 只有 负向前查找 (?!),
这就直接导致需要应用 负向后查找 时滴困境?!

其实如果 js 支持 负向后查找 滴话,
var reg = /(?<!{)\{0}/g;
就是最佳答案,可惜 js 不支持!
fosjos 2009-08-13
  • 打赏
  • 举报
回复
向前查找,是为了避免扫描并判断了前面的字符后,无法再对这些字符进行正则匹配

不支持向后查找也会有类似问题,但很少出现,毕竟已经扫描过的字符之前就可以做判断

楼主没说明白,是{{0}的{0}不可以吗,还有其他情况呢
yixianggao 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 s_liangchao1s 的回复:]
var s="This is a {0}, test {{0} {1}.";
var reg=/\s(?=\{0\})\{0\}/g;
alert(s.match(reg));
[/Quote]
而且这个正则还包含了 前导空格,结果是“ {0}”,并非“{0}”!

其实俺是想在 js 中实现类似 C# 中 String.Format 滴功能,
但是匹配占位符时遇到了麻烦!
s_liangchao1s 2009-08-13
  • 打赏
  • 举报
回复

那也起码得有个参照物吧?

<script type="text/javascript">
<!--
var s = "This is a {0}, test {{0} {1}.";
var reg = /[^{](?=\{0\})\{0\}/; //这样也不能算特例其实,,
alert(s.match(reg))
//-->
</script>

yixianggao 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 s_liangchao1s 的回复:]
JScript code<script type="text/javascript"><!--var s="This is a {0}, test {{0} {1}.";var reg=/\s(?=\{0\})\{0\}/
alert(s.match(reg))//--></script>
[/Quote]
呵呵,这么写也太特例了吧,没有空格时岂不玩完了?!
var s = "This is a{0}, test {{0} {1}."; // 这种情况就是 null
s_liangchao1s 2009-08-13
  • 打赏
  • 举报
回复

<script type="text/javascript">
<!--
var s = "This is a {0}, test {{0} {1}.";
var reg = /\s(?=\{0\})\{0\}/
alert(s.match(reg))
//-->
</script>
rainsome 2009-08-13
  • 打赏
  • 举报
回复

//参考提供的网址修改一下
var s = "This is a {0}, test {{0} {1}.";
var arr=['[Replace 1]','[replace 2]','[replace 3]' ];
//var regex=/(\{+)(\d+)(\}+)/g;
var regex=/(\{+)?{(\d+)}(?!\}+)?/g;
var _index='';
var result= s.replace(regex,function(){
if(arguments[1]) return arguments[0];
_index=arguments[2]-0;
if(_index<arr.length&&_index>=0)return arr[_index];
});
/*
var result= s.replace(regex,function(){
if(arguments[1].length!=1||arguments[3].length!=1) return arguments[0];
_index=arguments[2]-0;
if(_index<arr.length&&_index>=0)return arr[_index];
});
*/
alert(result);

[Quote=引用 13 楼 yixianggao 的回复:]
多谢各位兄弟捧场!

俺找到一个解决方案,大家一起学习

Mimicking Lookbehind in JavaScript
http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

一种介绍了三种方法,第一种方法应该就能解决俺滴问题,稍后贴出来;
第三种方法据说很强大,还没看懂,哈
[/Quote]
yixianggao 2009-08-13
  • 打赏
  • 举报
回复
String.format 已实现,欢迎大家指正!

L@_@K
/*
* summary: 将指定的 String 中的每个格式(例如:{0}, {1}等)项替换为相应对象的值的文本等效项。
* 需显示左大括号时,应输入双左大括号,即 "{{" 。
*
* parameter:
* fmtStr@string: 包含零个或多个格式项。
* paramsArray@paramsObject[]: 包含零个或多个要格式化的对象的 Object 数组。
*
* return: fmtStr 的一个副本,其中格式项已替换为 paramsArray 中相应 Object 实例的 String 等效项。
*
* example: document.write(String.format("hello, {0}, {1}!<br />keey {{{{2}}", "world", 123));
*/
String.format = function(fmtStr, paramsArray) {
var output = fmtStr;
var re;
var valueArray;

if (paramsArray instanceof Array)
valueArray = paramsArray
else
{
valueArray = new Array();
for (var i=1; i<arguments.length; i++)
valueArray.push(arguments[i]);
}

for (var i=0; i<valueArray.length; i++)
{
re = new RegExp("(\\{)?\\{"+i+"}", "g");
output = output.replace(re, function($0, $1){
return $1 ? $0 : valueArray[i];
});
}

return output.replace(new RegExp("\\{\\{", "g"), "{");
};

document.write(String.format("hello, {0}, {1}!<br />keey {{{{2}}", "world", 123));
rainsome 2009-08-13
  • 打赏
  • 举报
回复

//Try it.
var s = "This is a {0}, test {{0} {1}.";
var arr=['[Replace 1]','[replace 2]','[replace 3]' ];
var regex=/(\{+)(\d+)(\}+)/g;
var _index='';
var result= s.replace(regex,function(){
if(arguments[1].length!=1||arguments[3].length!=1) return arguments[0];
_index=arguments[2]-0;
if(_index<arr.length&&_index>=0)return arr[_index];
});
alert(result);
yixianggao 2009-08-13
  • 打赏
  • 举报
回复
多谢各位兄弟捧场!

俺找到一个解决方案,大家一起学习

Mimicking Lookbehind in JavaScript
http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

一种介绍了三种方法,第一种方法应该就能解决俺滴问题,稍后贴出来;
第三种方法据说很强大,还没看懂,哈
foolbirdflyfirst 2009-08-13
  • 打赏
  • 举报
回复
js不支持零宽反预查,这个是大问题,导致很多时候很不方便。
浴火_凤凰 2009-08-13
  • 打赏
  • 举报
回复
这类问题刚好需要反向的
Atai-Lu 2009-08-13
  • 打赏
  • 举报
回复
/\{[^\{].*\}/
fosjos 2009-08-13
  • 打赏
  • 举报
回复
简单的说,就是预查找和其他正则的区别
至于反向的话,字符在之前扫描时可以做判断,可能会有其他途径解决

楼主的这类问题刚好需要反向的,毕竟是脚本,功能不是很强大
yixianggao 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fosjos 的回复:]
向前查找,是为了避免扫描并判断了前面的字符后,无法再对这些字符进行正则匹配

不支持向后查找也会有类似问题,但很少出现,毕竟已经扫描过的字符之前就可以做判断

楼主没说明白,是{{0}的{0}不可以吗,还有其他情况呢
[/Quote]
兄弟滴解释俺再仔细看看,读了两遍没明白,嘿嘿

{{0}的{0}不可以吗,还有其他情况呢?

其实,只有这种情况,因为将 { 作为占位符使用,
当需要显示 { 时就表示为 {{ (.NET 中 String.Format 就是这么处理滴),
x{0},只要 x 不是 {,就要把 {0} 提取出来。

var reg = /(?<!{)\{0}/g;

可惜 js 中不能用!

87,910

社区成员

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

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