有效 WKT 线串的正则表达式(在 BigQuery 中)?

Posted

技术标签:

【中文标题】有效 WKT 线串的正则表达式(在 BigQuery 中)?【英文标题】:Regex for valid WKT Linestrings (in BigQuery)? 【发布时间】:2019-10-30 17:56:24 【问题描述】:

到目前为止,我有以下内容:

 select WKT, column1, column2
  from table
 where REGEXP_CONTAINS(WKT, r"-?(?:\.\d+|\d+(?:\.\d*)?)") is true

这可以解决大多数情况,但我仍然收到以下错误:

ST_GeogFromText failed: Linestring should have at least two unique points, but had 1

如何使用regex 过滤掉 Google BigQuery 中的所有个无效 LINESTRING?我不能使用ST_NUMPOINTS(),因为它需要一个GEOGRAPHY 对象,如果它无效,我无法将字符串转换为GEOGRAPHY

编辑:WKT LINESTRING 具有以下格式:LINESTRING (x1 y1, x2 y2, x3 y3, ..., xn yn) 其中每个 (xn, yn) 对代表第 n 个纬度/经度对。

【问题讨论】:

对于我们当中不知情的人:WKT 线串具有哪种结构?你能提供一些样品吗? 当然!我会相应地编辑问题,对此感到抱歉。 总而言之:我有一些看起来像这样的记录(LINESTRING (1.00 2.00)),但它们应该有不止一对数字(像这样:LINESTRING (1.00 2.00, 3.00 4.00) 【参考方案1】:

不要使用 REGEXP - 它不可能解决所有问题。例如。 WKT 的纬度可能大于 90 度,这会导致 ST_GeogFromText 失败,但在 REGEXP 中几乎不可能捕获。或者你可能有两个相同的点LINESTRING (1 2, 1 2),这也是无效的 LineString。

改用SAFE prefix,它会导致函数在输入无效时返回NULL而不是查询失败。这会给你准确的验证!

select SAFE.ST_GeogFromText('foo')
NULL

【讨论】:

【参考方案2】:

尝试以下扩展您的原始正则表达式

WHERE REGEXP_CONTAINS(WKT, r'LINESTRING \((?:(?:\.\d+|\d+(?:\.\d*)?) (?:\.\d+|\d+(?:\.\d*)?)(?:, |\)))2,')

【讨论】:

感谢您的回复。事实证明,使用 SAFE 前缀对我的用例来说更健壮。此外,如果有人没有该选项,我发现使用 LINESTRING\s\((?:\-?\d1,3(?:\.\d+)?\s\-?\d1,3(?:\.\d+)?)(?:\,\s?\-?\d1,3(?:\.\d+)?\s\-?\d1,3(?:\.\d+)?)+\) 无论如何都更强大,因为它允许捕获可能的值,例如:LINESTRING (-10.00002 111.222222,2 -4,1.646373 -20.555) 当然,没问题。我很难想象你不知道 SAFE 前缀。所以我假设您专门寻找正则表达式选项。是的 - 看起来我错过了-? 来解决负值:o)

以上是关于有效 WKT 线串的正则表达式(在 BigQuery 中)?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地从点创建线串?

Java 判断以数字开头的字串的正则表示式怎么写?

匹配重写规则的空字符串的正则表达式是啥?

空字符串的正则表达式

SQL Server - 地理

字符串正则表达式