Javascript 用于检测NSString以突出显示语法的正则表达式

Javascript 用于检测NSString以突出显示语法的正则表达式,javascript,regex,Javascript,Regex,我正在努力复习我的Objective C知识,我正在为我的笔记编写一个个人HTML页面。我有点偏离了方向,创建了一个基本的Javascript语法高亮显示,以突出显示我在页面上编写的代码!除了检测字符串,一切都进行得很顺利。我已经使用正则表达式来检测注释和关键字等,但我就是不知道如何拾取和突出显示NSString内容,当这些内容可能被转义时,如下所示: NSString = @"Hello \" world \" string"; 到目前为止我有 @"(([^"])*)" 它只在第一个“字符

我正在努力复习我的Objective C知识,我正在为我的笔记编写一个个人HTML页面。我有点偏离了方向,创建了一个基本的Javascript语法高亮显示,以突出显示我在页面上编写的代码!除了检测字符串,一切都进行得很顺利。我已经使用正则表达式来检测注释和关键字等,但我就是不知道如何拾取和突出显示NSString内容,当这些内容可能被转义时,如下所示:

NSString = @"Hello \" world \" string";
到目前为止我有

@"(([^"])*)"

它只在第一个“字符”处停止,如果前面没有反斜杠,如何使它忽略它?

处理转义的简单方法如下:

(?:\\.|[^\\"])+
其中,
\\
变成一个文字反斜杠,
是您的结束引用

它所做的是匹配转义字符,或者任何不匹配反斜杠和引号的字符。这意味着它跳过前面有反斜杠的引号,但它也正确地处理
(提示:这是三个反斜杠和一个右引号)

您可以在任何需要处理越狱的地方随意插入这个小宝石!

您可以使用这个:
(?=((?:[^“\\]+\\)*)\1
而不是
[^”]*

请注意,由于默认情况下点不匹配换行符,因此需要使用单线模式来匹配“转义”换行符


您需要使用模拟的原子组,因为双引号不平衡的字符串在失败之前会导致灾难性的回溯。

不要使用正则表达式来执行此操作。使用单个正则表达式将不起作用-如果字符串在注释中怎么办?如果它是嵌套的怎么办?如果html中至少包含html怎么办赞词?可能性是无穷的。当然它必须是可能的。我研究过使用Prettify,但想自己尝试一下。Prettify的代码非常复杂,不适合很好地学习!HTML和JavaScript不是常规语言。常规语言是可以使用有限状态机解析的语言事实上,这些都需要“有限内存”来解析。然而,由于HTML和JS可以任意嵌套,因此不可能用规则的东西对其着色(可以通过泵引理正式证明这一点)。您可以编写自己的(可能是递归下降)这个任务的解析器非常容易或简单,在您的例子中,迭代代码并在状态变量中记住您是否在字符串中。例如,这是用于检测JavaScript中的字符串-这仍然会找到以下字符串
/“Hello World”“
但它不是JavaScript字符串,而是注释。不要玩有趣的东西,比如
/*“/*”“
等等。@BenjaminGruenbaum不,这是一个正则表达式片段,可以应用于任何需要匹配字符串的情况。一、 例如,在我的自定义BBCode解析器脚本中使用它。更不用说,我会想象颜色编码解析器已经处理了注释块。我的解析器解析注释块,至少它可以在我的HTML注释页面上工作-它不会公开,所以如果它坏了,对我来说还不是世界末日!我使用了“/(\/*[^*]***\/)/”我只是无法将其用于字符串,因为我只想计算a”“'字符,如果它前面没有“\”,并且根据我目前发现的javascript后面没有我认为需要的负面外观。我不认为javascript只支持一次子模式。不过,我可能错了。请参阅我的答案,了解灾难性的无回溯解决方案;)嗯,我想那也不行<代码>\1用于精确匹配第一个子模式匹配的内容,因此。。。隐马尔可夫模型。。。事实上,我甚至不知道你的正则表达式现在做什么XD@NiettheDarkAbsol:您可以确定它是有效的,
(?=(子模式))\1
是在javascript或python中模拟原子组的方法,因为前瞻的内容自然是原子的。啊,我明白了。使用前瞻将其放入
\1
,然后说“好的,现在匹配它”。明白了。@NiettheDarkAbsol:没错。这是一种完全人工的方式,但是如果你在python或javascript中使用这种技巧,你可以看到显著的性能提升(即使你使用重炮),并且你可以避免在一个简单的非捕获组中出现灾难性的回溯问题。