regex - 如何懒惰地回溯正则表达式匹配?
问题描述
考虑以下字符串:
Wohnfläche angeblich: ca. 140 m²
Wohn/Nutzfläche ca. 211 m², renovie
Ca. 1111 gebautes und ab 222 umgebautes, etc , etc, ca. 144 m²
Ca. 71 m² große, etc (etc. ca. 1234)
在每种情况下,我都想使用适用于 VBA 的正则表达式模式提取 m² 值,即 140、211、144、71。
我遇到的问题是我找不到正确的正则表达式模式来懒惰地回溯(如果术语错误,请道歉)只能获得最短的匹配,即紧接在 m² 之前和 Ca.|ca 之后的数字。
我目前正在尝试:
ca\.\s(.*?)\s(?=m²)
带有标志|设置:多行 False、全局 False 和 ignoreCase True。
第三种情况是匹配过长的字符串:
Ca. 1111 gebautes und ab 222 umgebautes, etc , etc, ca. 144
代替:
ca. 144
鉴于 VBA 在外观方面的局限性,有没有办法获得所需的值?
例如失败:
Option Explicit
Public Sub test()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
With re
.Global = False
.MultiLine = False
.IgnoreCase = True
.Pattern = "ca\.\s(.*?)\s(?=m²)"
End With
Debug.Print re.Execute("Ca. 1111 gebautes und ab 222 umgebautes, etc , etc, ca. 144 m²")(0).submatches(0)
End Sub
临时解决方法不够具体,因为它忽略了 ca.|Ca。要求与"\s([0-9.]+)\sm²"
解决方案
您可以使用
ca\.\s*(\d+(?:[.,]\d+)*)\s*m²
请参阅正则表达式演示。
细节
ca\.
-ca.
字符串\s*
- 零个或多个空格(\d+(?:[.,]\d+)*)
- 第 1 组:一位或多位数字,然后是或的零次或多次重复,.
以及,
一位或多位数字\s*
- 零个或多个空格m²
- 一段m²
文字。
推荐阅读
- html - 在 100vh 中将 div 居中
- c# - 如何使用 ML.NET 检测 float[] 数组样本中的异常?
- python - 使用 PyQt5 将异步数据添加到 QTableView
- java - 读一个句子并只打印出相同字母连续重复 3 次或更多次的单词
- node.js - 地址已在使用 :::8080 但端口未被任何进程使用
- python - 如何在单个图中绘制多个 seaborn.distplot
- next.js - 无法在 Next.JS 中解构“未定义”或“空”的属性“html”
- excel - 将范围从一个工作簿复制到另一个工作簿
- php - if elseif else 三元运算符
- jolt - 在 JOLT 中将具有单个值的数组转换为字符串值