Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.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
Javascript 正则表达式-匹配长字符串中的模式_Javascript_Regex_String - Fatal编程技术网

Javascript 正则表达式-匹配长字符串中的模式

Javascript 正则表达式-匹配长字符串中的模式,javascript,regex,string,Javascript,Regex,String,我正在尝试匹配一个长字符串中的特定模式: 新西兰和(数据。操作员1:“外壳和放大器”和数据。字段:“新西兰”)或(数据。操作员:目的和数据。字段:曲柄)或(数据。操作员:调节器和数据。字段:HELICOPTOR) 我想选择以下所有值,后跟:但不选择AND/OR/not运算符 我正试图在Regex中使用look-ahead和look-after/behind功能,但无法实现 基本上是/(?)的组合? 我想将字符串更改为标题大小写,以便我可以清楚地区分和/或/或不 新西兰和(data.operato

我正在尝试匹配一个长字符串中的特定模式:

新西兰和(数据。操作员1:“外壳和放大器”和数据。字段:“新西兰”)或(数据。操作员:目的和数据。字段:曲柄)或(数据。操作员:调节器和数据。字段:HELICOPTOR)

  • 我想选择以下所有值,后跟:但不选择AND/OR/not运算符
  • 我正试图在Regex中使用look-ahead和look-after/behind功能,但无法实现
  • 基本上是/(?)的组合? 我想将字符串更改为标题大小写,以便我可以清楚地区分和/或/或不


    新西兰和(data.operator1:“Shell AND Amp”和data.field:“New Zealand”)或(data.operator:purpose AND data.field:crank)或(data.operator:Regulator AND data.field:Helicoptor)

    您可以使用带有命名组的正则表达式轻松表达词法,例如:

    const MY_LEXER = String.raw`
        (?<string> "[^"]*")
        |
        (?<operator> and|or|AND|OR)
        |
        (?<word> \w+)
        |
        (?<punct> [().:])
        |
        (?<ws> \s+)
    `
    
    结果会是这样

      [ 'word', 'NEW' ],
      [ 'ws', ' ' ],
      [ 'word', 'ZEALAND' ],
      [ 'ws', ' ' ],
      [ 'operator', 'AND' ],
      [ 'ws', ' ' ],
      [ 'punct', '(' ],
    
    等等。现在应该可以迭代,根据需要转换值并将它们重新组合在一起:

    for (let [type, val] of tokenize(myString, MY_LEXER)) {
        if (type === 'string' || type === 'word')
            val = val.toLowerCase();
        output += val;
    }
    

    你能通过使用适当的格式来改进你的问题吗?它也在将data.operator转换为小写。我试图只针对后面紧跟的内容:和自由文本,就像新西兰一样。我将尝试将data.xyz分类为一列……我对LEXER做了细微的更改,将列添加为另一个类别。(?[a-zA-Z0-9]*.[a-zA-Z0-9]*:)成功了。
    for (let [type, val] of tokenize(myString, MY_LEXER)) {
        if (type === 'string' || type === 'word')
            val = val.toLowerCase();
        output += val;
    }