regex 正则表达式,仅当函数名及其括号内有内容时才匹配函数名及其括号

rbpvctlc  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(91)

括号内将有一个Web链接,它是单引号之间的字符串。
函数的名称将始终相同。
例如,如果我有my_func('https://old.reddit.com'),字符串my_func()应该匹配,而'https://old.reddit.com'不应该匹配。
我能想到的最好的东西是my_func\((?=[^\)]+)\)

jfewjypa

jfewjypa1#

您可以使用lookbehind和lookahead,并匹配任何不是引号的内容(一次或多次),直到出现右引号和右括号:

const getFnArg = (str) => str.match(/(?<=\bmy_func\(['"`])[^'"`]+(?=['"`]\))/)?.[0];
console.log(getFnArg(`my_func('https://old.reddit.com')`))  // "https://old.reddit.com"
console.log(getFnArg(`my_func('whatever')`))  // "whatever"
console.log(getFnArg(`my_func(noquotes)`))    // undefined
console.log(getFnArg(`my_func('')`))          // undefined
console.log(getFnArg(`my_func()`))            // undefined

字符串
Regex1010.com demo
或者一个没有向后/向前看的简单例子:

const getFnArg = (str) => str.match(/\bmy_func\(['"`]([^'"`]+)['"`]\)/)?.[1];
console.log(getFnArg(`my_func('https://old.reddit.com')`))  // "https://old.reddit.com"
console.log(getFnArg(`my_func('whatever')`))  // "whatever"
console.log(getFnArg(`my_func(noquotes)`))    // undefined
console.log(getFnArg(`my_func('')`))          // undefined
console.log(getFnArg(`my_func()`))            // undefined

sauutmhj

sauutmhj2#

可以使用.+?

my_func\(.+?\)

字符串
这将匹配您的静态文本,并允许左括号和右括号内的任何值。
?将修改+,使其成为惰性量词。
这是在你有一个以上的my_func匹配文本的情况下,平衡括号将被匹配,而不是相邻的匹配。

相关问题