【问题标题】:Learn about regular expressions?了解正则表达式?
【发布时间】:2011-10-10 01:04:42
【问题描述】:

在回答我的一个问题时,有人发帖说:

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

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

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

【问题讨论】:

标签: javascript regex lookahead


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有各种资源:

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

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

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

    【讨论】:

      【解决方案3】:

      我有一个cheat sheet from visibone,我经常提到它。我发现这真的很有用

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-07
          • 2012-01-21
          • 2019-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多