3

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

// 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]);
    }
}

我完全迷失了/(;)(?![";"])/。对我来说,它看起来像是一堆随机符号:(。

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

4

4 回答 4

6

有各种资源:

关于实际表达式,/字符标记正则表达式字面量的开始和结束(就像引号对字符串所做的一样,尽管结尾/可能后跟标志),然后:

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

因此,总而言之,匹配(并捕获)一个分号,前提是它后面没有紧跟引号或分号。我看不出捕获分号的任何特殊原因,但在建议这样做的问题的上下文中可能有一个原因。

于 2011-07-21T08:44:49.260 回答
2

我有一张来自 visibone 的备忘单,我经常参考。我发现这真的很有用

于 2011-07-21T08:46:37.793 回答
1

看看http://www.regular-expressions.info/lookaround.html

该正则表达式中真正令人困惑的部分是负前瞻部分,它在 javascript 中使用(?! ... )语法表示。一旦你理解了这一点,剩下的就很简单了。

于 2011-07-21T08:45:30.747 回答
0

学习任何东西的最好方法就是通过实践。这是一个简单的测试器,可让您查看表达式的作用:https ://regex101.com/

于 2017-02-09T23:32:46.127 回答