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