知名文本的正则表达式

Joh*_*ell 5 regex wkt

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

POLYGON((51.124 -3.973, 51.1 -3.012, ....))
Run Code Online (Sandbox Code Playgroud)

或者

MULTIPOLYGON(((POLYGON((51.124 -3.973, 51.1 -3.012, ....)),POLYGON((50.14 -13.973, 51.1 -13.012, ....))
Run Code Online (Sandbox Code Playgroud)

除其他变化外。

这里有一个很好的答案:解析使用正则表达式的 WKT 文件

\d+(?:\.\d*)?
Run Code Online (Sandbox Code Playgroud)

从其他地方我也看到

\d*\.\d+|\d+
Run Code Online (Sandbox Code Playgroud)

(\d*\.)?\d+
Run Code Online (Sandbox Code Playgroud)

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

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

Cas*_*yte 5

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

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

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

字符串 | 模式| 状态
-----+----------------+---------------------------- ——
123 | \d*\.\d+|\d+ | 开始
1 23 |  \d* \.\d+|\d+ | 好的
12 3 |  \d* \.\d+|\d+ | 好
123   |  \d* \.\d+|\d+ | 好
123   | \d* \。\d+|\d+ | 失败 => 回溯
12 3 | \d* \。\d+|\d+ | 失败 => 回溯
1 23 | \d* \。\d+|\d+ | 失败 => 回溯
123 | \d*\.\d+ | \d+ | 转到下一个选择
1 23 | \d*\.\d+| \d+   | 好的
12 3 | \d*\.\d+| \d+   | 好
123   | \d*\.\d+| \d+   | 好的 => 成功

如果要匹配四种情况,可以使用:

\.\d+|\d+(?:\.\d*)?
Run Code Online (Sandbox Code Playgroud)

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

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

-?(?:\.\d+|\d+(?:\.\d*)?)
Run Code Online (Sandbox Code Playgroud)