了解正则表达式?

时间:2011-07-21 08:43:05

标签: 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]);
    }
}

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

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

4 个答案:

答案 0 :(得分:6)

有各种资源:

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

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

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

答案 1 :(得分:2)

我有一个cheat sheet from visibone我经常回复。我发现这非常有用

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

学习任何东西的最好方法就是做。这是一个简单的测试人员,可以让你看到表达式的作用:https://regex101.com/