有人可以告诉我正则表达式转换这种格式:
'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;
答案 0 :(得分: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