【发布时间】:2015-02-27 20:48:59
【问题描述】:
我是一个自学并玩弄 javascript 的菜鸟,我偶然发现了那个叫做“正则表达式”的噩梦......我对它们有点了解,我一直在做一些花哨的事情,但是我被困住了,我希望你向我澄清这一点:
我一直在阅读并寻找一种创建匹配的方法,并且我得到了很好的答案:
/////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// /////////////////
var $rows = $('#table tr');
$('#search').keyup(function() {
var val = '^(?=.*\\b' + $.trim($(this).val()).split(/\s+/).join('\\b)(?=.*\\b') + ').*$',
reg = RegExp(val, 'i'),
text;
$rows.show().filter(function() {
text = $(this).text().replace(/\s+/g, ' ');
return !reg.test(text);
}).hide();
});
/////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// /////////////////
我有点明白那里发生了什么,但有人可以为我分解它并“用 javascript 翻译”,这样我就可以更好地理解这个想法,我几乎不能用 jquery 做很酷的事情,因为我还在学习 javascript,我知道一些关于 jqueries 的事情,但不足以完全理解他在那里做了什么,也不足以知道编写 taht 代码的人是个天才
这是我的理解,请纠正我:
var $rows = $('#table tr');
这是范围,是要在其中寻找匹配的“目标”
pd:那是我第一次看到'$' 来声明变量,而对于我所看到的,它将它设置为一个 jQuery 对象..是这样吗?
var val = '^(?=.*\\b' + $.trim($(this).val()).split(/\s+/).join('\\b)(?=.*\\b') + ').*$',
reg = RegExp(val, 'i'),
text;
'$.trim($(this).val()' 等于 $.trim($("#user_input").val()); ..... ..对吗?
reg = RegExp(val, 'i')
reg 变量作为构造函数来查找不区分大小写的匹配项,但它不应该是 'reg = new RegExp(val, 'i')' 或者我也可以设置吗?
这是我最困惑的时候
$rows.show().filter(function() {
text = $(this).text().replace(/\s+/g, ' ');
return !reg.test(text);
}).hide();
我能理解的是,只有通过 text 变量设置的过滤器才会显示匹配项,而没有通过的匹配项将被隐藏,我对 $ 的含义一无所知(this) 相当于....在 text 变量中.. 从那里我不知道发生了什么,我发现 .test() 返回 true 或 false当它在正则表达式对象中找到匹配项时,为什么它的开头有 !?
【问题讨论】:
-
大多数情况下,正则表达式字符串构造将一些字符串拆分为单词,然后通过断言将它们连接在一起。生成的字符串类似于
^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3).*$,在 word3 之后有点缺少\b。正则表达式本身是对来自!reg.test(text);的text不包含任何 的验证(否定)。除此之外,我对JS不够了解。
标签: javascript jquery html regex