代码之家  ›  专栏  ›  技术社区  ›  Doc

正则表达式将GIS WKT从三维转换为二维

  •  1
  • Doc  · 技术社区  · 8 年前

    'LINESTRING ZM ( 574084.51000000 4229857.57000000 0.00000000 0.00000000, 574095.03000000 4229848.23500000 0.00000000 0.00870000)'

    到这个

    'LINESTRING ZM ( 574084.51000000 4229857.57000000, 574095.03000000 4229848.23500000)'

    我尝试了以下操作(通过oracle sql REGEXP\u REPLACE函数),但没有得到预期的结果(详见上文)

    select REGEXP_REPLACE( 
      'LINESTRING ZM ( 574084.51000000 4229857.57000000 0.00000000 0.00000000, 574095.03000000 4229848.23500000 0.00000000 0.00870000)',
      '(LINESTRING ZM )((([:digit:]+\.[:digit:]+ ){2})([:digit:]+\.[:digit:]+ ){2}(([:digit:]+\.[:digit:]+ ){2})([:digit:]+\.[:digit:]+ ){2})',
      '\1(\2, \5)'
     ) regex_output from dual;
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Will Barnwell user2481422    8 年前

    http://www.sqlfiddle.com/#!4/cb0077/7

    REGEXP_REPLACE(value, 
      '(( [0-9]+\.[0-9]{8}){2})( [0-9]+\.[0-9]{8}){2}',
      '\1'
    )
    

    根据我对一些文档的初步发现,这个答案的以下部分是错误的,其中 [:digit:] 已使用,切换到 [0-9] 已解决此问题。只需要有人来解决我的懒惰问题,并为我提供一个功能测试台。


    这是我的答案(在我花时间重新回答你删除并转发的问题时,有适当的格式和一些调整):

    (LINESTRING ZM )\((( [:digit:]+\.[:digit:]{8}){2})( [:digit:]+\.[:digit:]{8}){2},(( [:digit:]+\.[:digit:]{8}){2})( [:digit:]+\.[:digit:]{8}){2}\)
    

    并替换为

    \1(\2,\5)
    

    ( [:digit:]+\.[:digit:]{8}){2})( [:digit:]+\.[:digit:]{8}){2}
    

    并替换为

    \1
    
    推荐文章