【问题标题】:Extract string after last match strings [duplicate]在最后一个匹配字符串之后提取字符串[重复]
【发布时间】:2020-01-09 11:25:09
【问题描述】:

我正在使用 BigQuery,我想在特定匹配字符串之后提取字符串,在我的例子中,字符串是 sc

我有一个这样的字符串:

www.xxss.com?psct=T-EST2%20.coms&.com/u[sc'sc(mascscin', sc'.c(scscossccnfiscg.scjs']-/ci=1(sctitis)

我的预期结果是:

titis)

这可能吗?

【问题讨论】:

  • 使用哪个dbms?
  • 您还应该发布您尝试的 SQL 脚本,这将有助于我们在回复中提供更多上下文
  • 嗨,对不起,我忘了输入我的数据库。我在这种情况下使用 bigquery

标签: regex google-bigquery


【解决方案1】:

一般来说,在所有 RDBMS 中查找字符串中匹配的 last 实例的索引很容易通过首先反转字符串来计算。然后我们只寻找 first 匹配。

更新:BigQuery

​​>

按照String Functions documentation for BigQueryREGEXP_EXTRACT 的文档进行操作

注意: BigQuery 使用 re2 库提供正则表达式支持;请参阅该文档以了解其正则表达式语法。

不过,这个问题可以不用 RegEx 来解决。

BigQuery 支持数组处理并具有SPLIT 函数,因此您可以按查找变量进行拆分并仅捕获最后一个结果:

SELECT ARRAY_REVERSE(SPLIT(  !YOUR COLUMN HERE!  , "sc"))[OFFSET(1)]

我最初提交的以下改编可能仍然有效:

SELECT REVERSE(SUBSTR(REVERSE(@text), 1, STRPOS(REVERSE(@text), "cs") -1))

对于那些在 MS SQL Server 中有类似要求的人,可以使用以下语法。
其他 RDBMS 可以使用类似的查询,您必须使用适当的平台函数来获得结果。

DECLARE @text varchar(200) = 'www.xxss.com?psct=T-EST2%20.coms&.com/u[sc''sc(mascscin'', sc''.c(scscossccnfiscg.scjs'']-/ci=1(sctitis)'
SELECT REVERSE(LEFT(REVERSE(@text), CharIndex('cs', REVERSE(@text),1) -1))

生产者:titis)

您可以通过获取上述“sc”的最后一个 index 并在 SUBSTRING 中使用该值来获得类似的结果,但是要使其正常工作,您需要重新计算长度,此解决方案改为使用LEFT 函数,然后使用REVERSE 的结果,将查询的功能复杂度降低1(函数调用减少1)


逐步完成:

  1. 取反:

     SELECT REVERSE(@text)
    

    结果:

     )sititcs(1=ic/-]'sjcs.gcsifnccssocscs(c.'cs ,'nicscsam(cs'cs[u/moc.&smoc.02%2TSE-T=tcsp?moc.ssxx.www
    
  2. 现在我们找到'cs'第一个索引
    注意:我们还必须反转查找字符串的序列! em>

     SELECT CharIndex('cs', REVERSE(@text),1)
    

    结果:7

  3. 选择该索引之前的字符:
    注意:这里必须使用-1,因为SQL使用CharIndex的基于1的索引结果,所以我们必须将其减1

     SELECT LEFT(REVERSE(@text), CharIndex('cs', REVERSE(@text),1) -1)
    
  4. 最后,我们反转结果:

     SELECT REVERSE(LEFT(REVERSE(@text), CharIndex('cs', REVERSE(@text),1) -1))
    

【讨论】:

  • 嗨,克里斯,谢谢您的回答,我可以将它用于 bigquery 标准 sql 吗?对不起,我忘记提供我的数据库信息
  • 为 BigQuery 更新
  • 还添加了对我原始解决方案的 BigQuery 改编
【解决方案2】:

猜你可以使用 'sc' 作为分隔符,在查询中定义(如果字符串长度恒定)字符串长度(通配符),

 STRING_SPLIT ( string , separator )

【讨论】:

  • 这仍然是一个有效的响应,OP 已更新问题以表明正在使用 BigQuery,该引擎支持“SPLIT”和数组处理。
猜你喜欢
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多