1

有人可以告诉我正则表达式来转换这种格式:

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

每个逗号之间只应保留前两个数字。这 4 个坐标集可能有任意数量。

我尝试了以下(通过 oracle sql REGEXP_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;
4

1 回答 1

1

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
于 2017-10-12T21:05:22.603 回答