我有以下代码:
var html = "<div class='test'><b>Hello</b> <i>world!</i></div>";
var results = html.match(/<(\/?) (\w+) ([^>]*?)>/);
关于三组括号:
第一个意思是:正斜杠或什么都没有。
第二个意思是:一个或多个字母数字字符。
第三个意思是:除了'&gt;'之外的任何东西然后我不明白'*?' !
另外,我如何解释有三组括号用空格分隔的事实?
此致
答案 0 :(得分:2)
*
表示先前定义的文字“尽可能匹配”(可能为零个字符),?
表示:匹配足够以便RegExp返回一个匹配。
示例:
String:
Tester>
[^>]*
Tester
[^>]*?
<empty string>
[^>]*e
Teste
[^>]*?e
Te (Including T is required to produce a valid match)
在你的案例中:
String:
<input value=">"> junk
[^>]*>
<input value=">">
[^>]*?>
<input value=">
答案 1 :(得分:1)
星号(*
)表示匹配前一位零次或多次。前一位是[^>]
,意思是除了&gt;之外的任何东西。正如@ user278064所说,?
是多余的。这是为了使*
非贪婪,但没有必要,因为[^>]
已经指定了*
应该引用的内容。 (您可以将[^>]
替换为与任何字符匹配的.
(句号/句号),然后?
将确保它匹配任何内容,直到>
。)
至于空间,他们不应该在那里......他们确实匹配空间,我认为你不想要。
答案 2 :(得分:0)
*?
是一个“懒星”。
星形意味着“重复前一项零次或多次”。在这种情况下,前一项是一个字符类,它定义“除>
之外的任何字符”。
默认情况下,一颗星本身就是“贪婪”,这意味着它会匹配尽可能多的字符,同时仍然符合其周围表达式的其余标准。
通过添加问号将其更改为懒星意味着它将匹配尽可能少的字符,同时仍然符合其余条件。
对于你的表达式,这实际上对实际结果没有任何影响,因为你在明星之后立即匹配的角色是>
,这与前一个完全相反比赛。这意味着表达式将始终匹配[^>]*
的相同结果,无论它是懒惰还是贪婪。
在其他正则表达式中,差异更为重要,因为贪婪的表达式可以吞下字符串中稍后会在表达式中匹配的部分字符串。
然而,尽管结果可能没有差异,但是贪婪和惰性表达式之间可能仍然存在差异,因为处理它们的不同方式可能导致表达式以不同的速度运行。同样,我不认为它会在你的情况下有太大的不同,但在某些情况下它会产生很大的影响。
我建议在http://www.regular-expressions.info/阅读正则表达式 - 它有一个很好的参考表,可以提供您可能需要的所有正则表达式语法,以及许多困难主题的文章。