【问题标题】:How to lazily backtrack for regex match?如何懒惰地回溯正则表达式匹配?
【发布时间】:2021-04-18 23:49:36
【问题描述】:

考虑以下字符串:

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

【问题讨论】:

    标签: regex vba


    【解决方案1】:

    你可以使用

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

    请参阅regex demo

    详情

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多