复杂正则表达式与捕获组匹配

布赖恩

我正在尝试在天气报告(METAR格式,如果有帮助)中匹配一些天气。要匹配的文本可以包括以下内容:

“ RA”或“ SN”或“ TS”后跟“ B”和两位或四位数字,或“ E”和两位或四位数字,或两者都有,或多个“ B”和“ E”组(例如B05E20B45),结果类似“ RAB05E20B45”。这表示“降雨始于每小时过去的05,结束于过去20,然后又开始于过去45”。此外,在同一字符串中可以有多个类似的结构(例如,“ RAB05E20SNB25E55” =“雨始于05,始于20,然后降雪始于25,最终于55”)。

这是我想获得的一些示例输入和输出:

RAB05                     RAB05
RAB05E15                  RAB05E15
RAB05E15SNB25             RAB05E15     SNB05
RAB05E15SNB25E55          RAB05E15     SNB25E55
TSE01RAB05E15SNB25        TSE01        RAB05E15     SNB25
TSB01E55RAE15SNB25E55     TSB01E55     RAE15        SNB25E55

我很自以为是地认为以下方法可以做到...

((?:RA|SN|TS)(?:(?:B|E)(?:\d{2}|\d{4}))+)+

...但是由于我在这里哭泣,显然没有。

这是我的测试代码(VB 2013):

Imports System.Text.RegularExpressions

Public Class Form1
    Dim sItem As String = "TSB05E10RAB15"
    Dim sPattern As String = "((?:RA|SN|TS)(?:(?:B|E)(?:\d{2}|\d{4}))+)+"

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Regex.Match(sItem, sPattern).Success Then
            Dim rxMatches As GroupCollection = Regex.Match(sItem, sPattern, RegexOptions.IgnoreCase).Groups

            '0th item is the entire match (e.g. TSB05E10RAB15)
            'Succeeding elements are capture groups
            For i = 1 To rxMatches.Count - 1
                MessageBox.Show("Match #" & i & " = " & rxMatches(i).Value)
            Next
        End If
    End Sub
End Class

我期望的结果是“ TSB05E10”和“ RAB15”,但我得到的只是“ RAB15”。

我搜索了以下内容,但无济于事:

如果有人愿意向我展示我的方式中的错误...

编辑:

感谢每个人的帮助。这是有效的解决方案:

Imports System.Text.RegularExpressions

Public Class Form1
    Dim sItem As String = "TSB05E10SHRAB10E15SNB25E35B45E55"
    Dim sPattern As String = "(?:(?:SH)?(?:RA|SN)|TS)(?:(?:B|E)(?:\d{2}|\d{4}))+"
    Dim rx As New Regex(sPattern, RegexOptions.IgnoreCase)

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim matches As MatchCollection = rx.Matches(sItem)

        Label1.Text = "Input: " & sItem

        For Each match As Match In matches
            Dim groups As GroupCollection = match.Groups

            ListBox1.Items.Add(groups.Item(0).Value)
        Next
    End Sub
End Class
罗恩·罗森菲尔德

那些是真正的METAR吗?我以为您需要为每种降水类型确定开始时间和结束时间。另外,如果降水多雨,则可能在降水类型之前有SH。另外,您将数字量词指定为{2,4},表示2、3或4;确实应该是您所说的2或4。

无论如何,根据您的要求(并添加可选的SH并使用非捕获组来减少开销),请尝试:

(?:SH)?(?:RA|SN|TS)(?:(?:B|E)(?:\d{2}|\d{4}))+

编辑:缩短正则表达式。

关于正则表达式,您的问题是锚点,并且当您要分别解析不同的降水类型时,您正在重复降水类型的事实

编辑:我不确定VB 2013,但是在其他VB版本中,您需要将Regex对象的Global属性设置为True。


RegEx的说明:

  • (?:SH)? -可选的非捕获组匹配“ SH”
  • (?:RA|SN|TS) -与“ RA”或“ SN”或“ TS”匹配的非捕获组
  • (?:(?:B|E)(?:\d{2}|\d{4}))+ -“ B”或“ E”后跟2或4位数字(可以重复一次或多次)

非捕获组只是意味着括号中的内容被用作匹配的一部分,但该组不会“保存”以供以后访问(这是常规括号的工作方式)。

如果您将其全部分解,那么花点时间便很容易理解。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

复杂正则表达式与捕获组的匹配

来自分类Dev

正则表达式匹配并比较捕获的组

来自分类Dev

正则表达式匹配短语并创建捕获组

来自分类Dev

Vim中的正则表达式以匹配组捕获

来自分类Dev

使正则表达式仅匹配捕获组

来自分类Dev

正则表达式匹配并比较捕获的组

来自分类Dev

正则表达式:捕获组?

来自分类Dev

正则表达式,捕获组

来自分类Dev

正则表达式捕获组

来自分类Dev

正则表达式“匹配”与“捕获”

来自分类Dev

匹配捕获的正则表达式

来自分类Dev

正则表达式由于重复捕获组而不是重复捕获组而不匹配

来自分类Dev

正则表达式匹配组

来自分类Dev

正则表达式:捕获组中的捕获组

来自分类Dev

捕获组中的正则表达式捕获组

来自分类Dev

正则表达式捕获:将整个匹配项包含在捕获组中

来自分类Dev

正则表达式捕获:将整个匹配项包含在捕获组中

来自分类Dev

高级正则表达式-在替换中捕获整个复杂的语句组

来自分类Dev

正则表达式捕获具有完全匹配和部分匹配的子组

来自分类Dev

重复正则表达式捕获组的捕获部分

来自分类Dev

为什么此正则表达式也匹配非捕获组中的单词?

来自分类Dev

为什么我的正则表达式匹配但不捕获组?

来自分类Dev

在Expect中将我的捕获组以正则表达式模式匹配到变量

来自分类Dev

将先前捕获的组与正则表达式匹配(返回参考?)

来自分类Dev

Python正则表达式与完整捕获组不匹配

来自分类Dev

正则表达式匹配,但从捕获组中排除字符

来自分类Dev

正则表达式可以在更大的匹配范围内重复捕获组?

来自分类Dev

Python正则表达式返回最后一个匹配字符的额外捕获组

来自分类Dev

PHP正则表达式使用捕获组匹配HTML代码

Related 相关文章

  1. 1

    复杂正则表达式与捕获组的匹配

  2. 2

    正则表达式匹配并比较捕获的组

  3. 3

    正则表达式匹配短语并创建捕获组

  4. 4

    Vim中的正则表达式以匹配组捕获

  5. 5

    使正则表达式仅匹配捕获组

  6. 6

    正则表达式匹配并比较捕获的组

  7. 7

    正则表达式:捕获组?

  8. 8

    正则表达式,捕获组

  9. 9

    正则表达式捕获组

  10. 10

    正则表达式“匹配”与“捕获”

  11. 11

    匹配捕获的正则表达式

  12. 12

    正则表达式由于重复捕获组而不是重复捕获组而不匹配

  13. 13

    正则表达式匹配组

  14. 14

    正则表达式:捕获组中的捕获组

  15. 15

    捕获组中的正则表达式捕获组

  16. 16

    正则表达式捕获:将整个匹配项包含在捕获组中

  17. 17

    正则表达式捕获:将整个匹配项包含在捕获组中

  18. 18

    高级正则表达式-在替换中捕获整个复杂的语句组

  19. 19

    正则表达式捕获具有完全匹配和部分匹配的子组

  20. 20

    重复正则表达式捕获组的捕获部分

  21. 21

    为什么此正则表达式也匹配非捕获组中的单词?

  22. 22

    为什么我的正则表达式匹配但不捕获组?

  23. 23

    在Expect中将我的捕获组以正则表达式模式匹配到变量

  24. 24

    将先前捕获的组与正则表达式匹配(返回参考?)

  25. 25

    Python正则表达式与完整捕获组不匹配

  26. 26

    正则表达式匹配,但从捕获组中排除字符

  27. 27

    正则表达式可以在更大的匹配范围内重复捕获组?

  28. 28

    Python正则表达式返回最后一个匹配字符的额外捕获组

  29. 29

    PHP正则表达式使用捕获组匹配HTML代码

热门标签

归档