着名文本的正则表达式

时间:2014-03-12 15:22:53

标签: regex wkt

我正在研究正则表达式来验证和解析已知文本,这是一种用于传输空间数据的格式,如下所示:

POLYGON((51.124 -3.973, 51.1 -3.012, ....))

MULTIPOLYGON(((POLYGON((51.124 -3.973, 51.1 -3.012, ....)),POLYGON((50.14 -13.973, 51.1 -13.012, ....))

以及其他变体。

这里有一个很好的答案:Parsing a WKT-file使用正则表达式:

\d+(?:\.\d*)?

我也见过其他地方

\d*\.\d+|\d+

(\d*\.)?\d+

这些似乎都做了同样的事情,但它让我想知道这3个正则表达式的相对运作,以及是否有任何性能问题或细微之处需要注意。

要清楚,我知道有用于解析各种语言的WKT的库。我的问题纯粹是关于数字提取正则表达式的相对行为。

1 个答案:

答案 0 :(得分:3)

这取决于您需要允许的数字格式,例如:

 format 1:   22
 format 2:   22.2
 format 3:   .2
 format 4:   2.
  • 第一个模式\d+(?:\.\d*)?匹配1,2,4
  • 第二种模式\d*\.\d+|\d+匹配1,2,3
  • 第3个模式(\d*\.)?\d+匹配1,2,3(并且有一个不需要的捕获组)

注意:模式2和3比第一个更快成功,如果数字是整数,因为它们必须匹配所有数字,直到点,回溯到开始并重试相同的数字一更多时间。 (参见下面的架构)

str  |  pattern       |  state
-----+----------------+-----------------------------
123  |  \d*\.\d+|\d+  |  START
123  |  \d*\.\d+|\d+  |  OK
123  |  \d*\.\d+|\d+  |  OK
123  |  \d*\.\d+|\d+  |  OK
123  |  \d*\.\d+|\d+  |  FAIL => backtrack
123  |  \d*\.\d+|\d+  |  FAIL => backtrack
123  |  \d*\.\d+|\d+  |  FAIL => backtrack
123  |  \d*\.\d+|\d+  |  go to the next alternative
123  |  \d*\.\d+|\d+  |  OK
123  |  \d*\.\d+|\d+  |  OK
123  |  \d*\.\d+|\d+  |  OK => SUCCESS

如果您想匹配这四种情况,可以使用:

\.\d+|\d+(?:\.\d*)?

(+)如果数字不是以点开头,则第一个替代方案立即失败,第二个替代方案将匹配所有其他情况。回溯限制在最低限度 ( - )如果你的数字很少,以点开头,第一个替代品将被测试,并且每次都会失败。但是,第一种选择很快失败。(换句话说,出于同样的原因)。在这种情况下,最好使用\d+(?:\.\d*)?|\.\d+

显然,如果您想支持负值,则需要添加-?

-?(?:\.\d+|\d+(?:\.\d*)?)