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

我有以下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>
//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(“*”;
也是编写正则表达式片段的一个很好的资源。