了解正则表达式?

mow*_*ker 3 javascript regex lookahead

在回答我的一个问题时,有人发布了:

// could replace it with an easier to work with delimiter
str.replace(/(;)(?![";"])/g, '|')

// or split it, but skip over results that are just a ;
var strArr = str.split(/(;)(?![";"])/);
for (s in strArr) {
    if (strArr[s] !== ";") {
        // do something with strArr[s]
        console.log(strArr[s]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我完全迷失了/(;)(?![";"])/.它看起来像一堆随机符号给我:(.

哪里可以了解有关正则表达式语法的更多信息

T.J*_*der 6

有各种资源:

关于实际表达式,/字符标记正则表达式文字的开头和结尾(类似于字符串的引号,尽管结尾/可能后跟标志),然后:

     +------------- 1
     |+------------ 2
     ||+----------- 3
     ||| +--------- 4
     ||| |
     ||| |
     ||| | +------- 5
     ||| | | +----- 6
     ||| | | | +--- 7
     ||| | | | |+-- 8
     |||/ \|/ \||
    /(;)(?![";"])/
  1. (在这种情况下开始捕获组(因为(后面没有?,=或者!它改变它做什么)
  2. ; 是一个文字,它匹配分号
  3. ) 结束捕获组
  4. (?! 启动"负向前瞻",这样整体表达式只有在分号后面找不到括号内的内容时才匹配
  5. [ 开始一个字符类,匹配其中的任何字符
  6. ";"是字符类中的字符.(第二个"是冗余的.)字符类包含contains ;".
  7. ] 结束角色类
  8. ) 结束#4开始的负向前瞻

总而言之,匹配(并捕获)分号,前提是它不会立即跟引号或分号.我看不出捕获分号的任何特定原因,但也许在推荐这个问题的背景下有一个原因.