使用RegExp了解一些JavaScript

时间:2015-07-31 22:37:17

标签: javascript regex

我有以下js代码

var regex = new RegExp('([\'"]?)((?:\\\\\\1|.)+?)\\1(,|$)', 'g'),
key = regex.exec( m ),
val = regex.exec( m );

我想了解它。 特别是:

  • 为什么RegExp的定义中有所有反斜杠?我可以清楚地看到\\1是对第一个保存元素的引用。为什么在使用'而不是'的新RegExp中我们需要使用\\1而不是简单的\1

  • 为什么keyval的两个定义之间有逗号?我可能会猜测这取决于使用"g"查找的“实例”,但对我来说不太清楚。

我尝试用

执行代码
m = 'batman, robin' 

结果非常混乱,我无法解释得很清楚。

代码取自JQuery Cookbook,2.12

3 个答案:

答案 0 :(得分:0)

编写动态正则表达式对象和静态正则表达式对象时有区别。使用字符串初始化正则表达式对象时,需要将其转换为正则表达式对象。但是,' \'在regex对象中保存一个特殊值,但在javascript字符串中也是如此,因此双重转义。

编辑:关于你的第二个问题。您可以使用逗号执行多个声明,如下所示:

import java.util.PropertyResourceBundle
import javafx.fxml.FXMLLoader
import javafx.{scene => jfxs}

import scalafx.Includes._
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.scene.Scene

object MyApp extends JFXApp{
  val bundle = new PropertyResourceBundle(getClass.getResource("/i18n/en.properties").openStream)
  val fxml = getClass.getResource("/GUI/main.fxml")
  val root: jfxs.Parent = FXMLLoader.load(fxml, bundle)

  stage = new PrimaryStage() {
    title = "FXML Test"
    scene = new Scene(root) // root is implicitly converted to scalafx.scene.Parent
  }
}

第二次编辑:这是你的字符串编译成RegEx对象后会发生什么。

var one = 'one',
    two = 'two',
    three = 'three';

答案 1 :(得分:0)

  

为什么RegExp的定义中存在所有反斜杠?

"\\"是一个字符串,其值为\。一个反斜杠用作转义,第二个用作值。然后,在正则表达式中,您还需要再次使用反斜杠字符转义,因为反斜杠字符用于表示正则表达式中的特殊内容。

例如

"\\1"

是一个值为\1的字符串,它在正则表达式中与第一个捕获的组匹配。

"\\\\"

是一个值为\\的字符串,在正则表达式中与单个\字符匹配。

"\\\\\\1"

是一个值为\\\1的字符串,在正则表达式中匹配单个\,后跟第一个捕获的组。

这需要转义反斜杠,然后再次将它们转义称为“双重转义”。您需要双重转义的原因是您在正则表达式中具有正确的值。第一个转义是确保字符串具有正确的值,第二个转义是为了使正则表达式匹配正确的模式。

  

为什么key和val的两个定义之间有逗号?

您发布的代码是变量声明。格式化时更容易看到:

var regex = ...,
    key = ...,
    val = ...;

列表中的每个变量名都是通过var关键字声明的。它与单独声明关键字相同:

var regex,
    key,
    val;

regex = ...
key = ...
val = ...

与使用不同的var关键字声明每个var相同:

var regex = ...
var key = ...
var val = ...

答案 2 :(得分:0)

正则表达式更好地表示为正则表达式字面值:

var regex = /(['"]?)((?:\\\1|.)+?)\1(,|$)/g;

反斜杠用于转义特殊字符。例如,如果你的正则表达式需要匹配文字句点,那么写.将不起作用,因为.匹配任何字符:你需要"转义"反斜杠的句号:\.

必须对转义不属于转义序列的反斜杠进行转义,因此如果您只想在文本中匹配反斜杠,则必须使用反斜杠转义它:\\

传递到RegExp构造函数时,正则表达式如此复杂的原因是因为您将上述正则表达式表示为字符串,这会添加另一个"层"逃避。因此,每个反斜杠必须通过另一个反斜杠进行转义,并且因为该字符串用单引号括起来,所以必须使用另一个反斜杠转义单引号:

var regex = new RegExp('([\'"]?)((?:\\\\\\1|.)+?)\\1(,|$)', 'g'),