【问题标题】:Regex to get 2 specific characters between other 2 specific characters正则表达式在其他 2 个特定字符之间获取 2 个特定字符
【发布时间】:2022-01-05 08:27:33
【问题描述】:

我有一个字符串:

[](first-(second))

我想删除[](...和最后一个...)之间的()

话虽如此,我目前正在使用(?<=\[\]\()(.*?)(?=\))

我认为(.*?) 需要替换为某种表达式,可以在两者之间找到()

类似于string.replace(/(?<=\[\]\()(.*?)(?=\))/g, '')的东西

字符串应该看起来像[](first-second)

【问题讨论】:

  • 试试贪婪的,(?<=\[\]\()(.*)(?=\))。如果它是一行中唯一的字符串,这将起作用。
  • 它在两者之间找到整个文本。我需要找到具体的()
  • 那么,由于 JavaScript 正则表达式不支持递归,所以需要明确括号是否只能配对,如果是,请指定要支持的嵌套深度,以及是否支持无限深度,不能用正则表达式,自己写解析函数。
  • 关于它在之间找到整个文本:是的,但是您可以将匹配中的所有()替换为string.replace。见jsfiddle.net/1hfeoxzk
  • 逐个字符检查直到找到起始边界(您也可以为此使用正则表达式),然后将堆栈用于() 并省略所有这些直到您找到一个配对的。

标签: javascript regex string replace


【解决方案1】:

由于您已经在 J​​avaScript 的模式中使用了lookbehind,因此您可以在lookbehind 中使用无限量词,匹配您不想保留的 2 括号并在第 1 组中捕获您想要保留的内容。

在替换使用组1中使用$1

(?<=\[\]\([^()]*)\(([^()]*\))\)

模式匹配:

  • (?&lt;= 正面向后看,断言左边是:
    • \[]匹配[]
    • \([^()]* 匹配 ( 和 0+ 次除 () 之外的任何字符
  • ) 近距离观察
  • \(匹配(
  • ([^()]*\)) 捕获 group 1,匹配除 () 之外的任何字符 0+ 次
  • \)匹配)

Regex demo

const s = "[](first-(second))"
const regex = /(?<=\[]\([^()]*)\(([^()]*\))\)/;
console.log(s.replace(regex, "$1"))

或者使用 2 个捕获组而不是后视:

(\[]\([^()]*)\(([^()]*\))\)

Regex demo

const s = "[](first-(second))"
const regex = /(\[]\([^()]*)\(([^()]*\))\)/;
console.log(s.replace(regex, "$1$2"))

【讨论】:

    【解决方案2】:

    如果您不需要时尚的代码,为什么不走简单的路呢? 提取没有外部括号的子字符串,替换和连接。删除的字符

    s = '[](first-(second))'

    mySubstring = s.substring(3, s.length -2);  // 'first-(second)'
    //your replacement func.
    result = '[]('+mySubstring+')';             //'[](first-second)'
    

    【讨论】:

      【解决方案3】:

      这是一个示例(不使用前瞻)。它应该会引导您朝着正确的方向前进。

      使用 2 个捕获组和一些非贪婪集,您可以组装目标字符串。

      它假定没有额外的嵌套括号或方括号,但您可以根据需要修改为仅在字符集中包含字母数字字符。

      const d = '[](foo-(bar)) [](foo2-(bar2))'
      const rx = /(\[\]\([^-\(\)\[\]]*?-)\(([^\)]*?)\)\)/g
      
      const m = rx.exec(d)
      console.log(m)
      
      const fixed = d.replace(rx, '$1$2)')
      console.log(fixed)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-16
        • 2022-11-17
        相关资源
        最近更新 更多