javascript正则表达式以匹配单引号、双引号和正则表达式斜杠之间的任何内容
我试图匹配双引号、单引号或正则表达式斜杠之间的任何内容,基本上是javascript没有标记为字符串或正则表达式的任何内容。到目前为止,我想到的是:javascript正则表达式以匹配单引号、双引号和正则表达式斜杠之间的任何内容,javascript,regex,Javascript,Regex,我试图匹配双引号、单引号或正则表达式斜杠之间的任何内容,基本上是javascript没有标记为字符串或正则表达式的任何内容。到目前为止,我想到的是: /"[^\\"\n]*(\\"[^\\"\n]*)*"|'[^\\'\n]*(\\'[^\\'\n]*)*'|\/[^\\\/\n]*(\\\/[^\\\/\n]*)*\// 但正如你所看到的,这有几个问题 基本上这不应该匹配1+2/3+4/5,因为它不是正则表达式。也 not match“match here\\“not match”应该匹配第
/"[^\\"\n]*(\\"[^\\"\n]*)*"|'[^\\'\n]*(\\'[^\\'\n]*)*'|\/[^\\\/\n]*(\\\/[^\\\/\n]*)*\//
但正如你所看到的,这有几个问题
基本上这不应该匹配1+2/3+4/5
,因为它不是正则表达式。也not match“match here\\“not match”
应该匹配第一部分,而不是第二部分(单引号和正则表达式也是如此)
这应该怎么写
编辑:如果无法使用正则表达式区分
1+2/3+4/5
、/*comment*/
和/regex/
,我将如何解决notmatch“match here\\\“notmatch”匹配c类转义字符串的技巧如下:
" (\\. | [^"]) * "
就是
- quote
- repeat (
- one escaped char
- or not a quote
)
- quote
与单引号类似。python中的插图,因为JS正则表达式很难看:
import re
test = r"""
foo "bar" and "bar\"bar" and "bar\\bar" and "bar \\"
foo 'bar' and 'bar\'bar' and 'bar\\bar' and 'bar \\'
"""
rr = r"""(?x)
" (\\. | [^"]) * "
|
' (\\. | [^']) * '
"""
print re.sub(rr, '@@', test)
> foo @@ and @@ and @@ and @@
> foo @@ and @@ and @@ and @@
可能需要向[^”]
组添加换行符
请注意,此表达式非常宽容,允许使用许多无效的javascript构造。有关完整而准确的实现,请参阅。刚刚找到了答案。我非常接近。以下是解决方案:
/"[^\\"\n]*(\\["\\][^\\"\n]*)*"|'[^\\'\n]*(\\['\\][^\\'\n]*)*'|\/[^\\\/\n]*(\\[\/\\][^\\\/\n]*)*\//
它与thg435答案非常相似,但我认为它的性能更高一点,因为它不会回溯太多
我缺少的是在寻找转义引号时,我也应该寻找转义反斜杠,所以我将\\\“
更改为\\[”\\]
与thg435的答案相反,thg435的答案在反斜杠后面看任何东西,反斜杠虽然有效,但可以在正则表达式中使用更多的状态你不能区分1+2/3+4/5
、/*注释*/
和/regex/
,你需要一个合适的解析器。@thg435注意,请参阅editIt要将JavaScript字符串文字与JavaScript的RegExp匹配,请参见此处:(我根据规范编写,因此保证不会过度接受或拒绝)。保证匹配有效的JS字符串,但不能保证正确匹配任意JS源代码中的所有JS字符串(例如,注释中类似字符串的序列).空格是怎么回事?“\x4”
在JS中不是有效的字符串。速度稍微提高(\\.\124;[^”])
到([^”]\\)
@MosheK:不![^”]
将使用斜杠,使转义不被解析。@nhatdh:我在答案中添加了一条注释。我的意思是给OP一个想法,而不是一个完整的解决方案。