gpt4 book ai didi

知名文本的正则表达式

转载 作者:行者123 更新时间:2023-12-04 04:17:15 25 4
gpt4 key购买 nike

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

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 的库。我的问题纯粹是关于数字提取正则表达式的相对行为。

最佳答案

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

 format 1:   22 format 2:   22.2 format 3:   .2 format 4:   2.
  • the 1st pattern \d+(?:\.\d*)? matches 1,2,4
  • the 2nd pattern \d*\.\d+|\d+ matches 1,2,3
  • the 3rd pattern (\d*\.)?\d+ matches 1,2,3 (and have an uneeded capturing group)

Note: pattern 2 and 3 are slower to succeed than the first if the number is an integer, because they must match all digits until the dot, backtrack to the start and retry the same digits one more time. (see the schema below)

str  |  pattern       |  state-----+----------------+-----------------------------123  |  \d*\.\d+|\d+  |  START123  |  \d*\.\d+|\d+  |  OK123  |  \d*\.\d+|\d+  |  OK123  |  \d*\.\d+|\d+  |  OK123  |  \d*\.\d+|\d+  |  FAIL => backtrack123  |  \d*\.\d+|\d+  |  FAIL => backtrack123  |  \d*\.\d+|\d+  |  FAIL => backtrack123  |  \d*\.\d+|\d+  |  go to the next alternative123  |  \d*\.\d+|\d+  |  OK123  |  \d*\.\d+|\d+  |  OK123  |  \d*\.\d+|\d+  |  OK => SUCCESS

if you want to match the four cases, you can use:

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

(+) 如果数字不以点开头,第一个选项会立即失败,第二个选项将匹配所有其他情况。回溯被限制在最低限度。
(-) 如果你有几个以点开头的数字,第一个选择将被测试并且每次都会失败。然而,第一个选择很快就失败了。(换句话说,出于同样的原因)。在这种情况下,最好使用 \d+(?:\.\d*)?|\.\d+
显然,如果你想支持负值,你需要添加 -? :
-?(?:\.\d+|\d+(?:\.\d*)?)

关于知名文本的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22356063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com