Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式中(\/?)的含义(\w+;)([^>;]*?)是冗余吗?_Javascript_Regex - Fatal编程技术网

Javascript 正则表达式中(\/?)的含义(\w+;)([^>;]*?)是冗余吗?

Javascript 正则表达式中(\/?)的含义(\w+;)([^>;]*?)是冗余吗?,javascript,regex,Javascript,Regex,我认为这个正则表达式应该匹配一个html开始标记 var results=html.match(/]*?)>/ 我知道它应该首先捕获]*?)>搜索每个字符,除了>=0次?如果是,为什么需要捕获(\w+)?它不属于[^>]*?(\/?)匹配的权限范围内,并捕获任何结束标记,例如可能,或者,如果您熟悉它们的话 另一件需要注意的事情是,\w实际上是字符类[a-zA-Z\ud],因此其他字符如=,“”等不匹配,但是将由[^>]匹配。是的,关于该位,您是正确的。按令牌获取它: /开始正则表达式文字 匹

我认为这个正则表达式应该匹配一个html开始标记

var results=html.match(/]*?)>/

我知道它应该首先捕获
]*?)>
搜索每个字符,除了
>=0次?如果是,为什么需要捕获
(\w+)
?它不属于
[^>]*?

(\/?)
匹配的权限范围内,并捕获任何结束标记,例如
可能,或者
,如果您熟悉它们的话


另一件需要注意的事情是,
\w
实际上是字符类
[a-zA-Z\ud]
,因此其他字符如
=
”等不匹配,但是将由
[^>]
匹配。是的,关于该位,您是正确的。

按令牌获取它:

  • /
    开始正则表达式文字
  • 匹配文字
  • /
    end regex literal
Lazly*-在重复量词后添加“?”将使其延迟执行,这意味着正则表达式将与前面的标记匹配最少的次数。请参阅

所以这个正则表达式基本上会匹配“”,最后跟一个“>”

也就是说,令牌
(\w+)
不是多余的,因为它确保
之间至少有一个单词字符


请注意。

要回答您的最后一个问题,
(\w+)
([^>]*?)
不是多余的。它们都在表达式中起重要作用

此表达式查找开始或结束标记

(\/?)
/
匹配,但
使其成为可选的

(\w+)
匹配单词字符,用于匹配此处的标记名

([^>]*?)
用于匹配属性

因此,如果您有字符串

表达式中的
(\w+)
将匹配
div
,而
([^>]*?)
将匹配
class=“text”

演示(在ruby中,不是javascript,但没有区别):


总而言之,这是为了捕获结束标记。

使用debuggex的强大功能生成图像:)

]*?)>
将像这样进行评估

如您所见,它与HTML标记(开始和结束标记)匹配。正则表达式包含三个捕获组,捕获以下内容:

  • (\/?)
    是否存在
    /
    (如果存在,则为结束标记)
  • (\w+)
    标记的名称
  • ([^>]*?)
    标记关闭前的所有其他内容(例如属性)
  • 这样它就匹配了

    另一件有趣的事情是,标记名捕获并不能捕获所有理论上有效的XHTML标记。XHTML允许
    字母|数字|'。|'-'|'|':'|..
    (源代码:)。
    (\w+)但是,
    -
    不匹配。虚构的
    标记将不会与此正则表达式匹配。不过,这不会对实际生活产生任何影响


    您可以看到,使用RgExes解析HTML是一件危险的事情。使用HTML解析器可能会更好。

    它会查找结束标记,而不是…将标记名捕获到一个参数中以用于替换,而不是将其与attrib部分捆绑在一起…对于匹配项,您不需要它,但是如果将regexp回收到replace()中,请帮助它…@p.s.w.g是的,它与正则表达式不匹配。它只是作为正斜杠的一个示例,但我想我将使用另一个=/谢谢。我不明白我在哪一点上是正确的though@thomas这一点:“我认为
    ([^>]*?)>
    搜索除
    >=0次之外的每个字符的推理正确吗?”:)这个“?如果同一行上有多个html标记,则不冗余@TomLord我编辑了答案,以包括
    *?
    的实际功能。我自己也学到了一些新东西:)@TomLord为什么让这场比赛“懒惰”有用?事实上,我收回了这一点——它实际上是多余的。但是让我解释一下。。。假设代码说的是(.*),而不是([^>]*?)。(这就是我认为它基本上正在做的,乍一看!)比较一下有/没有“?”:但是,在实际代码中,这不是问题,因为即使是“贪婪”([^>]*)也只会匹配第一个“>”。而且看起来是开始标记。谢谢你的回答和酷的测试网站!我的意思是“end tags”,如中所示,是一个开始标记,也是一个结束标记。它很挑剔,但是
    ([^>]*?)
    实际上匹配`class=“text”`(包括'div'后面的空格):)@tessi你是对的,如果你编辑我的帖子,你可以看到我在那里有空间,但是当它被显示时,它会被删除。如果有人能建议一种方法来获得展示空间,我将不胜感激。哈,这很有趣。我再也不会因为那个(特定的)空间而责备你了;)同意<代码>([^>]*?)
    本身并不是多余的。但是在
    (\w+)([^>]*?)>
    中,延迟操作是冗余的。正则表达式必须匹配一个或多个“word”字符(不是“>”),后跟零个或多个非右尖括号字符,后跟右尖括号字符。不管贪婪与否,它必须精确匹配该字符(类)序列。仅当您匹配的字符类型也可能与下面的字符类型匹配时,如
    *?@JayC中可能存在的字符类型,Lazy才适用。我认为我的答案中的那句话不清楚,希望编辑更清楚。
    
    <(\/?)(\w+)([^>]*?)>