正则表达式:Javascript

时间:2018-02-28 19:25:54

标签: javascript php regex

我试着绕过这个在服务器端工作的正则表达式。

new RegExp(/(?<!:\s*\w*)\w+(?=\s*[,}])/g)

它遍历一个看起来像这样的字符串:

{Product{id{$lt:10,$gt:20},title,other,categories{id,name}}}

匹配所有没有子键或值的键。但这在Javascript中不起作用,因为Javascript不允许RegExp的Lookbehind部件。我想知道Javascript中是否有解决方法。我所读到的只是Lookbehind,但不适用于Lookbehind + Lookahead。

你可以在这里玩弄它。 regex101.com

编辑:更多信息:这个正则表达式是一个解析器的一部分,它解析一个简约的查询语言 - 一个GraphQL和MondoDB-Queries的嵌合体。

有一个字符串进入的功能,如

{Product{id{$lt:10,$gt:20},title,other,categories{id,name}}}

并输出一个对象。所有没有子键或值的键实际上以&#39;,&#39;结尾。或者&#39;}&#39;替换为:true。最后,输出看起来像这样:

{
Product: {
    id: { $lt: 10 },
    title: true,
    categories: {
        name: true
    }
}

}

我试图让它成为客户端。

2 个答案:

答案 0 :(得分:0)

我认为这解决了你的问题

&#13;
&#13;
const regex = /[{,]\s*\w+(?=[,}])/g
const str = `{Product{id{$lt:10,$gt:20},title,other,categories{id,name}}}`
const result = str.replace(regex, (...a) =>  `${a[0]}:true`)
console.log(result)
&#13;
&#13;
&#13;

答案 1 :(得分:0)

不确定你想要得到的结果,但这是你的正则表达式 不使用lookbehind断言 如果您感兴趣,整个想法是移动比赛位置
超出你不想匹配的东西。

就是这样。

 (?:                           # -------------
      ( : \s* \w+ )                 # (1), Move past this
   |                              # or,
      ( \w+ )                       # (2), To get to this
 )                             # -------------
 (?= \s* [,}] )                # Common lookahead assertion

通常,您只需使用JS回调功能来找出匹配的内容。

var regex = /(?:(:\s*\w+)|(\w+))(?=\s*[,}])/g;
var str = '{Product{id{$lt:10,$gt:20},title,other,categories/{id,name}}}';

var newString = str.replace(
       regex,
       function(match, p1, p2) {  // Callback function
         if (p1) return p1;       // Group 1, return it unchanged
         return p2 + ':true';     // Group 2, modifiy it
       });

console.log(newString);

输出

{Product{id{$lt:10,$gt:20},title:true,other:true,categories/{id:true,name:true}}}