【问题标题】:Extracting string pattern that is not within square brackets using regex使用正则表达式提取不在方括号内的字符串模式
【发布时间】:2019-08-21 13:27:40
【问题描述】:

我正在尝试从方括号中也包含一些信息的字符串中提取字母数字字符。

例如:

  • 这是一些示例文本 [第一句话]
  • [第二句][重要]更多示例文本
  • [不重要] 这也是示例

我希望输出是:

  • 这是一些示例文本
  • 更多示例文本
  • 这也是样例

我尝试使用否定前瞻,在'['之前提取模式(仅适用于少数情况)。

【问题讨论】:

  • 你希望sql 怎样出现在这个节目中?
  • @CaiusJard 我正在使用 presto 查询记录在表中的一组字符串值。它使用与 javascript 相同的正则表达式功能。
  • 您可以运行正则表达式替换来删除括号中的所有内容,而不是尝试提取不在括号中的内容吗?例如用""替换" *\[.*?\] *"

标签: sql regex


【解决方案1】:

根据我的评论,在快速浏览一下精美的 presto 手册后,您能否:

SELECT regexp_replace('[second sentence][important] some more sample text', ' *\[.*?\] *');

正则表达式是任意数量的空格,然后是方括号,然后是任意数量的任意字符,直到下一个方括号,然后是方括号,然后是任意数量的空格。

我从手册中挖出了这个函数(无法访问 presto/从未使用过),我假设只提供两个参数,它隐式地将匹配替换为空

【讨论】:

  • 谢谢你,成功了。但是我使用了REGEXP_REPLACE(string_field, '\[.*?\]', '')
  • 没问题 - 我有额外的空格星号来尝试消除括号周围的尾随和前导空格。您也可以 TRIM,或任何 presto 用于从字符串末尾删除空格
【解决方案2】:

您可以尝试为此使用正则表达式,但我认为为此创建自己的函数会很好。

function getText(bracketedText) {
  let idx = 0
  let newIdx = 0
  let str = ''
  while (newIdx !== -1) {
    newIdx = bracketedText.indexOf('[', idx)
    if (newIdx < 0) {
      str += bracketedText.slice(idx, bracketedText.length)
    } else {
      str += bracketedText.slice(idx, newIdx)
    }
    idx = bracketedText.indexOf(']', newIdx + 1) + 1
  }
  return str
}

这在去除括号中的任何内容时应该相当有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2015-07-05
    相关资源
    最近更新 更多