Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 要匹配的正则表达式需要模块吗?_Regex - Fatal编程技术网

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的正则表达式