当前位置: 首页 > 知识库问答 >
问题:

连接两个正则表达式,以支持嵌套引号

魏雅惠
2023-03-14

我尝试实现一个简单的属性路径标记器,以便以后可以快速计算结果。

以下是我的初步实现:

function tokenize(path: string): (string | number)[] {
    const res = [], reg = /\[\s*(\d+)|["']([^"']+)["']\s*]|[a-z_$0-9]+/gi;
    let a;
    while (a = reg.exec(path)) {
        res.push(a[1] ? parseInt(a[1]) : a[3] || a[2] || a[0]);
    }
    return res;
}

它可以先接受这样的输入:。a、 b[123]。c['prop1']。d[“prop2”]。最后,并生成以下快速分辨率阵列:

['first', 'a', 'b', 123, 'c', 'prop1', 'd', 'prop2', 'last']

我遇到的问题是添加对嵌套引号的支持-'",对于这样的输入:first["a\'b"]。第二['"']

更准确地说,我不知道如何将这里的解决方案之一注入到我的正则表达式中。这些解决方案本身工作得很好,只是不是我自己的正则表达式的一部分,所以把两个表达式合并成一个是我一直坚持的问题。

共有1个答案

孙承
2023-03-14

匹配并捕获字符集引号。然后,您可以重复除捕获的引号外的任何字符,并在量词内具有负前瞻性,然后再次匹配引号。

如果需要在引号之间的同一分隔符之前处理反斜杠,可以在匹配非分隔符之前使用任何转义字符进行替换。这将重复匹配:

  • 任何转义字符,或
  • 不是捕获的分隔符的任何字符
(?:\\.|(?!\2).)*
function normalize(path) {
    const res = [], reg = /\[\s*(\d+)(?=\s*\])|\[(["'])((?:\\.|(?!\2).)*)\2\]|[\w$]+/gi;
    let a;
    while (a = reg.exec(path)) {
        res.push(a[1] ? parseInt(a[1]) : a[3] || a[0]);
    }
    return res;
}
console.log(normalize(`first.a.b[123].c['prop1'].d["prop2"].last`));
console.log(normalize(`first["a\'b"].second['"']`));
console.log(normalize(`["one\"two"]`));
console.log(normalize(`['one\'two']`));
 类似资料:
  • 本文向大家介绍正则表达式匹配闭合HTML标签(支持嵌套),包括了正则表达式匹配闭合HTML标签(支持嵌套)的使用技巧和注意事项,需要的朋友参考一下 任何复杂的正则表达式都是由简单的子表达式组成的,要想写出复杂的正则来,一方面需要有化繁为简的功底,另外一方面,我们需要从正则引擎的角度去思考问题。关于正则引擎的原理,推荐《Mastering Regular Expression》中文名叫《精通正则表达

  • 问题内容: 我一直试图在Java中编写一个正则表达式以删除下面括号中的所有内容,同时保留其他所有内容。 注意,括号可以嵌套,这就是为什么我的模式失败的原因 。有人能帮我吗?下面我试过了: 但这打印: d4 Nf6 2. c4 g6 3. Nc3 Bg7 4. e4 d6 5. Nf3 OO 6. Be2 e5 7. dxe5 dxe5 8. Qxd8 Rxd8 9. Bg5 Nbd7 10. OO

  • 问题内容: 我正在实现某种解析器,我需要定位并反序列化 嵌入到其他半结构化数据中的 json对象。我用了regexp: 定位物体 但不适用于嵌套对象,因为表达式仅匹配第一个找到的右花括号。对于 它匹配 因此字符串对于反序列化变得无效。我知道有一个贪婪的业务正在考虑中,但是我对正则表达式并不熟悉。您能否帮助我扩展表达式以使用所有可用的大括号。 更新: 明确地说,这是尝试从具有嵌入式JSON的半结构化

  • 我有一个输入字符串,里面有括号,外面有双引号。这些括号可以嵌套。我想去掉只有在双引号外才有括号的字符串。 我尝试了这个正则表达式这将获取包含在圆括号内的所有内容,无论双引号内外。 我得到的实际输出是: 我预计产出为:

  • 我有3个正则表达式,但当模式匹配时执行相同的操作,所以我考虑将所有三个表达式合并为一个。我尝试了很多,但无法让“|”I.e”或“在我的正则表达式中工作 regex1:<代码>文本。替换(/([\u00A9-\u3299])/g,函数myFunction(x){…} regex2: regex3: 我试过这样做,但它不起作用regex:

  • 是否可以按任意顺序定义嵌套的正则表达式? 以下程序按预期工作: 如果交换前两行,编译器将产生错误。 有没有办法覆盖这个限制(不使用)?