我正在尝试在天气报告(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] 删除。
我来说两句