我正在尝试匹配双引号,单引号或正则表达式斜杠之间的任何内容,基本上任何未被javascript标记为字符串或正则表达式的内容。到目前为止,我想出的是:
/"[^\\"\n]*(\\"[^\\"\n]*)*"|'[^\\'\n]*(\\'[^\\'\n]*)*'|\/[^\\\/\n]*(\\\/[^\\\/\n]*)*\//
但是有一些问题,你可以看到here
基本上这不应该与1+2/3+4/5
匹配,因为它不是正则表达式。此外
Dont match "Match here\\" Dont match"
应匹配第一部分而不是第二部分(对于单引号和正则表达式也是如此)
应该怎么写?
修改:如果使用正则表达式无法区分1+2/3+4/5
,/*comment*/
和/regex/
,我将如何解决Dont match "Match here\\" Dont match"
问题
答案 0 :(得分:0)
匹配c-like类型转义字符串的技巧是这样的:
" (\\. | [^"]) * "
即,
- quote
- repeat (
- one escaped char
- or not a quote
)
- quote
与单引号相似。自JS正则表达式丑陋以来python中的插图:
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构造。有关完整而准确的实施,请参阅https://stackoverflow.com/a/13800082/989121。
答案 1 :(得分:0)
刚想通了。我很亲密。这是解决方案:
/"[^\\"\n]*(\\["\\][^\\"\n]*)*"|'[^\\'\n]*(\\['\\][^\\'\n]*)*'|\/[^\\\/\n]*(\\[\/\\][^\\\/\n]*)*\//
这与thg435的答案非常相似,但我认为它的表现要多一点,因为它没有那么多的回溯
我缺少的是在查找转义引用时,我本来也应该寻找转义反斜杠,所以我将\\"
更改为\\["\\]
而不是thg435的回答在反斜杠之后,有效时可以在正则表达式引擎中使用更多状态