【问题标题】:Get 5 Characters After Last Slash在最后一个斜线后获得 5 个字符
【发布时间】:2020-12-15 07:50:22
【问题描述】:

我需要最后一个斜杠后的前 5 个字符。我可以处理斜线后的所有符号,但不能只取前 5 个。

REGEX_SUBSTR('people/capital/base/flagedbyloggers','[^/]*$')

使用[^/]*$,我得到flagedbyloggers,但我只需要flaged,前5个符号。

使用[^/]{5}$,我得到ggers,即最后一个斜杠后的最后5个符号,但我需要flaged,最后一个斜杠后的前5个符号。

有时最后一个斜杠后面的字符串可能会更短,因此它必须使用少于 5 个字符,例如people/capital/base/no 应该只返回 no

环境是ORACLE数据库。我使用在线工具 https://regexr.com/ 得到的结果相同。

【问题讨论】:

  • 环境是什么?试试([^/]{6})[^/]*$
  • 我认为您需要 6 个字符,对吧? ^.*\/(.{6})regex101.com/r/ysmdud/1
  • “我认为环境不重要”确实很重要。每当您发布正则表达式问题时,重要的是包括您正在使用的编程语言、工具或正则表达式风格。这是因为并非所有风格都支持所有正则表达式功能。语法也可以不同。

标签: sql regex oracle


【解决方案1】:

您不需要正则表达式。您可以使用简单的字符串函数:

SELECT SUBSTR( value, INSTR( value, '/', -1 ) + 1, 6 ) AS substring
FROM   table_name;

其中,对于样本数据:

CREATE TABLE table_name ( value ) AS
SELECT 'people/capital/base/flagedbyloggers' FROM DUAL;

输出:

|子串 | | :-------- | |标记 |

db小提琴here

【讨论】:

  • 感谢您的回答。我更喜欢正则表达式,因为它们是通用的,可以在后端/前端代码中重用。 +1
  • @TPAKTOPA 它们不保证是通用的; Oracle 不支持全部范围的正则表达式语法(例如,您不能使用非捕获组或在单词边界上进行匹配)。字符串函数非常通用,它们在前端和后端之间可能有不同的名称,但是当您知道要实现的目标时,从最后一个斜杠字符的索引之后的字符开始查找长度为 6 的子字符串将是从 Oracle 数据库转换为 Python/Java/C++/等非常容易。 (中间层)到 JavaScript(客户端)。
【解决方案2】:

您可以匹配直到最后一次出现 / 与捕获组和量词 {1,6} 以匹配 noflaged

注意flaged是6个字符而不是/之后的5个字符

This page 展示了如何使用REGEXP_SUBSTRREGEXP_REPLACE 从匹配中获取捕获组。

^.*/([^/]{1,6})[^/]*$

说明

  • ^.*/ 确保匹配最后一次出现的 /
  • ( 捕获第 1 组
    • [^/]{1,6} 匹配除/ 以外的任何字符 6 次
  • )关闭第一组
  • [^/]* 匹配除 / 之外的任何字符的 0+ 次出现
  • $ 字符串结束

查看regex demo

【讨论】:

  • 这适用于所有场景,谢谢。看起来我的正则表达式演示站点也无法正常工作,所以我将开始使用您的演示/测试正则表达式。
【解决方案3】:

您可以使用以下REGEXP_SUBSTR代码:

REGEXP_SUBSTR('people/capital/base/flagedbyloggers', '([^/]{1,6})[^/]*$', 1, 1, NULL, 1)

请参阅regex demo。详情:

  • ([^/]{1,6}) - 除了/ 之外的一到六个字符(第 1 组,REGEXP_SUBSTR 中的最后一个参数提取此值)
  • [^/]*$ - 除/ 之外的任何零个或多个字符,直到字符串的末尾。

【讨论】:

  • 感谢您的回答,它适用于最后一个字符串,但不适用于较短的字符串。此外,函数的参数也有帮助。 +1
  • @TPAKTOPA 我更改了量词。这实际上不是问题,因为该解决方案适用于当前的 OP。
  • 我的错,我编辑了帖子并稍后添加,它也应该适用于较短的文本。
【解决方案4】:

如果除了斜杠字符是单词,可以使用下面的语句。

/(\w{5})\w*$

Regex101 Demo

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 2020-10-13
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2015-07-29
    • 2022-10-23
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多