首页 > 解决方案 > 如何懒惰地回溯正则表达式匹配?

问题描述

考虑以下字符串:

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²"

标签: regexvba

解决方案


您可以使用

ca\.\s*(\d+(?:[.,]\d+)*)\s*m²

请参阅正则表达式演示

细节

  • ca\.-ca.字符串
  • \s*- 零个或多个空格
  • (\d+(?:[.,]\d+)*)- 第 1 组:一位或多位数字,然后是或的零次或多次重复,.以及,一位或多位数字
  • \s*- 零个或多个空格
  • - 一段文字。

推荐阅读