Regex 要匹配的正则表达式需要模块吗?
我在自定义文本编辑器中使用正则表达式来有效地白名单某些模块(断言和加密)。我已经接近我需要的了,但还不完全满足。这是:Regex 要匹配的正则表达式需要模块吗?,regex,Regex,我在自定义文本编辑器中使用正则表达式来有效地白名单某些模块(断言和加密)。我已经接近我需要的了,但还不完全满足。这是: /require\s*\(\s*'(?!(\bassert\b|\bcrypto\b)).*'\s*\)/ 我希望正则表达式匹配任何带有require('foo')的行其中foo是除“assert”或“crypto”之外的任何内容。我失败的例子是require('assert')与我的正则表达式不匹配,但是需要('assert')已正确匹配 您可以使用:require\s*\
/require\s*\(\s*'(?!(\bassert\b|\bcrypto\b)).*'\s*\)/
我希望正则表达式匹配任何带有require('foo')的行代码>其中foo是除“assert”或“crypto”之外的任何内容。我失败的例子是require('assert')代码>与我的正则表达式不匹配,但是需要('assert')代码>已正确匹配
您可以使用:require\s*\(\s*'(?!(\bassert'\bcrypto')).'\s*\)
不同之处在于,我将模块名称末尾的单词boundary\b
替换为'
。在\b
中,模块名'assert'
与负前瞻相匹配,因为t
与\b
相匹配。在新版本中,我们需要在模块名称的末尾添加”
编辑
正如Cary Swoveland所建议的,不需要引导\b
:
require\s*\(\s*'(?!(assert'|crypto')).*'\s*\)
如果您不想在和之间匹配断言
或加密
,
,您可以更改前瞻以准确断言。您可以省略与“
后面的单词匹配的单词边界
如果在第一次出现'
之前,以下内容应该匹配,则可以使用否定字符类[^'\r\n]*
来匹配除“或换行符”之外的任何字符
require\s*\(\s*'(?!(assert|crypto)')[^'\r\n]*'\s*\)
^
我认为您不需要这么复杂的东西,这个简单的模式很好:
require\((?!'crypto'|'assert')'.'\);
我从有缺陷的正则表达式中假设,如果存在匹配,则将捕获“(“
和”)”
之间的字符串。一种方法如下
r = /
require # match word
\ * # match zero or more spaces (note escaped space)
\( # match a left paren
(?! # begin a negative lookahead
' # match a single quote
(?:assert|crypto) # match either word
' # match a single quote
(?=\)) # match a right paren in a forward lookahead
) # end negative lookahead
' # match a single quote
(.*?) # match any number of characters lazily in a capture group 1
' # match a single quote
\) # match a right paren
/x # free-spacing regex definition mode
由于捕获组后面跟有一个单引号,因此捕获组中的匹配字符会延迟确保捕获组中没有匹配的单引号。我本来可以写([^']*)
。以常规形式,该正则表达式的编写如下:
r = /require *\((?!'(?:assert|crypto)'(?=\)))'(.*?)'\)/
请注意,在自由间距中,正则表达式定义模式的空格将被删除,除非它们被转义,放入字符类([]
),替换为\p{Space}
等等
"require ('victory')" =~ r #=> 0
$1 #=> "victory"
"require (' assert')" =~ r #=> 0
$1 #=> " assert"
"require ('assert ')" =~ r #=> 0
$1 #=> "assert "
"require ('crypto')" =~ r #=> nil
"require ('assert')" =~ r #=> nil
"require\n('victory')" =~ r #=> nil
请注意,如果我在上一个示例中将正则表达式中的空格字符替换为“\s”
,我将获得:
"require\n('victory')" =~ r #=> 0
$1 #=> "victory"
它与'assert'
或'assert'
不匹配,如果我理解正确,它应该匹配。@mrzasa哦,对了,我误解了这个要求,现在应该可以很好地工作了:)我不明白你为什么需要单词边界。我遗漏了什么吗?我试着尽可能少地修改OP版本。我添加了另一个不带\b
s的正则表达式