在最后一个匹配字符串之后提取字符串

时间:2020-01-09 11:25:09

标签: regex google-bigquery

我正在使用BigQuery,我想在特定的匹配字符串之后提取字符串,在我的情况下,字符串为sc

我有一个像这样的字符串:

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

我的预期结果是:

titis)

这可能吗?

2 个答案:

答案 0 :(得分:0)

通常,在所有RDBMS中,通过首先反转字符串,很容易计算出字符串中 last 实例的索引。那么我们只在寻找 first 匹配项。

更新:BigQuery

按照String Functions documentation for BigQuery中的REGEXP_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' first 索引
    注意:我们还必须逆转查找字符串的顺序!

     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))
    

答案 1 :(得分:-2)

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

@Repository
public interface EmployeeAddressRepository extends JpaRepository<EmployeeAddress, Integer> {

  @Query("select empAdd from EmployeeAddress empAdd where empAdd.Employee.employeeId=?1 and (endDate) ORDER BY empAdd.lastUpdateTimeStamp DESC")
  List<EmployeeAddress> findEmployeeAddressByEmployeeId(String employeeId, LocalDate date) throws PersistenceException;
}
相关问题