【问题标题】:Regex - JavaScript , match the regex for the 2nd argument of a functionRegex - JavaScript,匹配函数第二个参数的正则表达式
【发布时间】:2020-12-02 01:32:06
【问题描述】:

我有一个名为waitForCompletion(arg1,value,waitTime)的函数;

我想找到一种方法来知道我在函数的第二个参数上,即waitForCompletion(arg1,

用例:- 当用户开始输入函数名称并在第二个参数上时,我必须触发一些智能感知来显示第二个参数可以接受的值的智能感知。

我目前有以下内容,但它只匹配函数名称并为所有参数触发我的智能感知,但它必须只对第二个参数执行此操作。

let completionMatch = textUntilPosition.trim().match(/(^waitForCompletion)|(\swaitForCompletion)/);

if(completionMatch){  //trigger intellisense }

我相信我们必须匹配函数名称后的(,但不知何故忽略第一个参数并匹配然后匹配第一个参数后的,,这就是我可以确保我的模式匹配的时候。

注意:- textUntilPosition 获取文本直到我的光标所在的位置,即如果我的光标在第二个参数 waitForCompletion(arg1, 中,如果我的光标在第一个参数上它是 waitForCompletion(arg1

【问题讨论】:

    标签: javascript regex regex-lookarounds regex-group


    【解决方案1】:

    当用户开始输入函数名称并在第二个参数上时,我必须触发一些智能感知来显示第二个参数可以接受哪些值的智能感知。

    你不能用一个简单的正则表达式来做到这一点,你需要一个 JavaScript 解析器。有几个开源的可用,例如Espree(ESLint 使用的解析器)和Acorn

    原因是 JavaScript 语法在“正则表达式”中的“正则”意义上不是 regular。例如,考虑:

    waitForCompletion(x ? example(1, 2) : y, 
    

    您的正则表达式必须理解条件运算符 (? :) 才能知道您当时在 waitForCompletion 的第二个参数中,而不是在向 example 提供第二个参数时更早。这只是参数比单个标识符或文字更复杂的众多方式之一。


    我不想似乎在阻止这一点,或者似乎对此毫无帮助。这是一个在许多情况下都可以使用您所描述的简单参数的示例,但正如我在上面所说(以及在下面的评论中),它失败并出现 lots 其他输入:

    "use strict";
    const rex = /(^|\s)waitForCompletion\s*\((?:[^,]+|(["'])[^\1]*?\1),\s*$/;
    // true:
    console.log(rex.test("waitForCompletion(arg1,"));
    // false, wrong function:
    console.log(rex.test("blahwaitForCompletion(arg1,"));
    // false, second arg present
    console.log(rex.test("waitForCompletion(arg1, arg2"));
    // true:
    console.log(rex.test("\twaitForCompletion(\"hi\","));
    // true, there's a comma, but it's in a string (1):
    console.log(rex.test("waitForCompletion(\"h,i\","));
    // true, there's a comma, but it's in a string (2):
    console.log(rex.test("waitForCompletion('h,i',"));

    【讨论】:

    • 参数非常具体,不涉及条件,它们是纯字符串字段。例如:- waitForCompletion("hello", ,)
    • @Veryon890 - 对此有两个回应::-) 首先,你怎么知道?为什么人们不能根据条件和函数调用创建字符串?但第二:没关系,即使只是文字字符串也太复杂了:waitForCompletion("Well, he said \"But then there's nested quotes with commas,\" and I began to wonder..." 这甚至没有进入模板文字。我已经走这条路太多次了(两次可能就足够了,但我很密集):您在此处应用的任何天真的正则表达式解决方案在实际使用中失败,我害怕。
    • 抱歉没有说清楚,所以函数有一个签名,我们对第一个参数的值很严格,用户只能输入一组值(比如一些自定义数据库列)只是没有特殊字符的纯字符串值。
    • @Veryon890 - 但是,为什么我不能根据条件选择要传递的列并使用函数返回字符串?您可以严格控制,但(在绝大多数情况下)您不能严格控制如何确定该值。无论如何,我添加了一个正则表达式示例,如果第一个参数中不存在逗号并且没有换行符,该正则表达式将起作用。
    • @Veryon890 - waitForCompletion(,,) 是 JavaScript 中的语法错误。 :-) (waitForCompletion( , 也是如此,但正则表达式很幼稚......)您可以省略数组文字中的值,但不能省略函数参数列表。 (但如果您希望它匹配,请将正则表达式中的第一个 + 更改为 *。)
    猜你喜欢
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多