Javascript 返回一些不合适的值的正则表达式
我有以下javascript代码:Javascript 返回一些不合适的值的正则表达式,javascript,html-parsing,html,Javascript,Html Parsing,Html,我有以下javascript代码: <script type="text/javascript"> //javascript starts var patt=/[<](\S+).*>(.*)<\/\1>/; var str='<a id="test">hi</a> <p></p>'; alert(str.match(patt)); alert(patt.exec(str)); </script
<script type="text/javascript"> //javascript starts
var patt=/[<](\S+).*>(.*)<\/\1>/;
var str='<a id="test">hi</a> <p></p>';
alert(str.match(patt));
alert(patt.exec(str));
</script>
//javascript启动
变量patt=/[(.*)/;
var str='hi';
警报(str.match(patt));
警报(patt.exec(str));
人们希望能在html文档中找到所有标记,因此理想情况下,它应该返回hi,
但它当前返回hi,a,hi
为什么会发生这种情况?
还有另一个问题,str.match(patt)和patt.exec(str)
之间有什么区别?使用哪个更好?var patt=/[(.*)/g;
var patt=/[<](\S+).*>(.*)<\/\1>/g;
尝试指定全局
修饰符(或在找到第一个匹配项时停止)
关于第二个问题,MDN是一个很好的资源:从 如果正则表达式不包含
g
标志,则返回与regexp.exec(字符串)相同的结果。如果正则表达式包含g
标志,则方法返回包含所有匹配项的数组。如果没有匹配项,则方法返回null
试试这个:
var patt=/<\S+[^>]*>[^<]*<\/\S+>/g;
var patt=/]*>[^您需要将全局修饰符g
附加到您的正则表达式:/[(.*)/g
- 如果不使用
g
global修饰符,将返回一个数组,该数组包含字符串中的整个第一个匹配项作为第一个元素,后跟匹配项中的任何括号匹配模式作为后续数组元素
- 如果使用
g
修饰符,match
和exec
将从字符串中获取所有匹配项。match
将它们作为数组返回,而exec
将为每个匹配项返回一个数组(使用匹配模式,就像不使用g
一样)但是对exec
的多次调用都将返回不同的匹配,直到报告所有匹配为止(参见下面的示例)
一般来说,我建议将match
置于exec
之上,因为exec
依赖于正则表达式的维护状态(具体地说,lastIndex
,即应该恢复匹配的字符串的索引)。如果要在多个字符串上使用正则表达式,我发现这是有害的:
var reg = /\w/g;
reg.exec("foo"); // ["f"]
reg.exec("foo"); // ["o"]
reg.exec("bar"); // ["r"] -- does not start at the beginning of the string
将其与匹配行为进行比较:
var reg = /\w/g;
"foo".match(reg); // ["f", "o", "o"]
"bar".match(reg); // ["b", "a", "r"]
// we can now use the arrays to get individual matches
但是,如果在全局搜索中需要为每个匹配使用括号内的匹配模式,则必须使用exec
,因为match
的全局应用程序只获取整个匹配的列表,而不获取与这些匹配的匹配模式
// the ending digit is a match pattern
var reg = /\w(\d)/g;
// match only gets list of whole matches
"d1b4h7".match(reg); // ["d1","b4","h7"]
// exec gets the match and the match pattern
reg.exec("d1b5h7"); // ["d1","1"]
reg.exec("d1b5h7"); // ["b4","4"]
reg.exec("d1b5h7"); // ["h7","7"]
总之,听起来像是要使用带有全局修饰符的match
,因为您不需要匹配模式信息。如果确实需要匹配模式信息,请使用循环重复调用exec
,直到exec
返回null
而不是数组,以获取所有匹配。为什么不使用dom解析器而不是regex?好吧,除了其他东西之外,jquery是一个非常好的dom解析器,但我这里需要的是一个html解析器而不是dom解析器。我正在从文件读取html输入dom代表“文档对象模型”,这是浏览器对xml/html字符串代码的内部表示。jQuery也处理这一问题:$('your valid html string here…')。find('a');
使用jQuery,您的查询将是$(htmlString)。find(“*”;
也是编写正则表达式片段的一个很好的资源。