【问题标题】:Teradata regular expressionsTeradata 正则表达式
【发布时间】:2020-02-25 03:33:21
【问题描述】:

如何删除出现在第二个栏之后的所有内容?

SELECT REGEXP_replace('/admin/home/log', '(/\w+){,2}','');
SELECT REGEXP_replace('/admin/home/out', '(/\w+){,2}','');
SELECT REGEXP_replace('/admin/login', '(/\w+){,2}','');
SELECT REGEXP_replace('/test/login', '(/\w+){,2}','');
SELECT REGEXP_replace('/test/login/file/cam', '(/\w+){,2}','');

解决方案:

/admin/home
/admin/home
/admin/login
/test/login
/test/login

【问题讨论】:

    标签: regex teradata


    【解决方案1】:

    使用regexp_replace()

     SELECT REGEXP_REPLACE('/admin/home/log/test', '([^/]/[^/]*/).*$', '\1');
    

    【讨论】:

    • 如果字符串没有至少 2 个斜杠,STRTOK 选项将出现异常 - 它最终会在末尾添加一个斜杠,这很奇怪。 SELECT STRTOK('/test/login', '/', 1) || '/' || STRTOK('/test/login', '/', 2) || '/'; 返回test/login/。你也失去了第一个斜线。正则表达式是完美的。
    • strtok 太挑剔了。我会删除。
    • 第三个参数('\1')在做什么?那不是替换字符串吗?
    • ([^/]/[^/]*/) 是一个捕获组,它正在寻找一个 1) 不包含斜杠 2) 后跟斜杠 3) 后跟不带斜杠的字符串 4) 后跟斜杠的字符串.然后.*$ 就是之后的所有内容,直到结束。它用第一个(也是唯一的)捕获组替换匹配的(所有内容):/1。也许有更漂亮的方法,但现在是下午 4 点,我的大脑正在关闭。
    【解决方案2】:

    如果替换剩余部分,您可以简单地提取第三个斜杠之前的所有内容:

    SELECT REGEXP_SUBSTR('/admin/home/log', '(/[^/]+){1,2}');
    

    【讨论】:

      猜你喜欢
      • 2019-03-04
      • 2017-08-09
      • 2018-08-02
      • 2018-01-30
      • 2016-10-08
      • 2021-06-09
      • 2020-01-14
      • 2021-06-09
      • 2023-03-12
      相关资源
      最近更新 更多