Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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:好的部分regexp.exec(字符串)解释_Javascript_Html_Regex - Fatal编程技术网

JavaScript:好的部分regexp.exec(字符串)解释

JavaScript:好的部分regexp.exec(字符串)解释,javascript,html,regex,Javascript,Html,Regex,我试图从Crockford的JavaScript中理解这个代码示例中发生了什么:好的部分 // Break a simple html text into tags and texts. // (See string.replace for the entityify method.) // For each tag or text, produce an array containing // [0] The full matched tag or text // [1] The tag na

我试图从Crockford的JavaScript中理解这个代码示例中发生了什么:好的部分

// Break a simple html text into tags and texts.
// (See string.replace for the entityify method.)
// For each tag or text, produce an array containing
// [0] The full matched tag or text
// [1] The tag name
// [2] The /, if there is one
// [3] The attributes, if any
var text = '<html><body bgcolor=linen><p>' +
'This is <b>bold<\/b>!<\/p><\/body><\/html>';
var tags = /[^<>]+|<(\/?)([A-Za-z]+)([^<>]*)>/g;
var a, i;
while ((a = tags.exec(text))) {

    for (i = 0; i < a.length; i += 1) {
    document.writeln(('// [' + i + '] ' + a[i]).entityify( ));
        }
    document.writeln( );
    }

最难理解的部分是g global如何影响正则表达式的解释方式。我也不懂正则表达式。逐行解释会很好。

开关的意思是,在找到第一个匹配项后,它将继续搜索匹配项。如果没有它,regexp将在第一次匹配后停止


就正则表达式本身而言,我还没有足够的专家对此发表评论。但是很好-检查页面右下角的快速参考,输入您自己的,然后开始掌握它们。

这里是一个很好的正则表达式图表:

[^]+未找到<或>标记的一个或多个字符 |或 <小于符号 \/? 斜杠/,可选 [A-Za-z]+一个或多个英文字母 [^]*零个或多个非<或>字符 >大于号 。。。。意味着它是一个。使用它们可以提取部分标记

g标志意味着您可以重复执行.exec以获得许多结果。如果没有g标志,您的while将进入无限循环。基本上,这是一个循序渐进的过程

如果正则表达式使用g标志,则可以多次使用exec方法来查找同一字符串中的连续匹配项。执行此操作时,搜索从正则表达式的lastIndex属性指定的str子字符串开始

参考:

对于代码本身,For循环将打印捕获组的匹配文本。例如:

// [0] </b>         <-- Matched text (whole tag)
// [1] /            <-- Capture group 1, used to capture the slash (closing tag)
// [2] b            <-- Capture group 2, used to capture tag name
// [3]              <-- Capture group 3, used to capture attributes (if any)
/-启动正则表达式模式

[^]+-一个或多个非尖括号字符这包括换行符

|-或

-直角支架

/g-结束正则表达式模式并设置全局修饰符,该修饰符将继续匹配,直到输入结束

注:上面的示例表明注释中的第1组和第2组发生了逆转


正如drjimmie1976所提到的,regex101是一个很好的资源:。

全局标志不影响正则表达式的解释方式,但它影响正则表达式的执行方式。如果没有全局标志,exec方法只会找到第一个匹配项,并在再次调用时说没有其他匹配项,而不是在找到所有匹配项之前为每个调用返回新的匹配项

正则表达式:

[^]匹配任何不匹配的字符 +是一个量词,表示对上一个匹配进行一次或多次匹配 |是or操作员吗


因此,前面的部分匹配代码中非HTML标记的文本,后面的部分匹配一个HTML标记,捕获可选/、标记名和所有属性。

选择g时,多次调用exec以获得下一个匹配,但如果不是,则始终返回第一个匹配。我不确定你到底在问什么。好吧,我现在明白g部分了。好吧,我创建了一个jsbin,应该会有点帮助。你能解释一下轨道图吗?为什么底部轨道上没有<>before>。另外,问号在\/?@熊添加的解释中是什么意思。@TheBear-[^]*不表示<>和?表示可选,最多一个。