多个组而不是一个组

时间:2014-12-20 05:23:27

标签: regex vb.net

我试图匹配网址,到目前为止它的工作效果很好 - 除了我有多个网站。如果可以,我想得到一个小组。我的目标是将地址一直提升到单个(前进)斜杠。

例如,给定此URL

http://docs.oracle.com/javase/8/docs/technotes/guides/install/windows_jdk_install.html#BABGDJFH
输出将是:

http://docs.oracle.com

另外在另一方面,有时候开头httphttps不存在;但它是可选的,反正我也不需要它。

当前的正则表达式我正在使用

 ^(https?:\/\/)?([\da-z\.-]+)([a-z\]{2,6})([\/\w \.-]*)

第一组是可选的,这意味着网址可以以httphttps开头,也可以两者都不开头。其余的是域名本身。当我运行上面的正则表达式时,我会回到我需要的东西,但在更多的组中,而不仅仅是一个;而且我想得到一个小组。如果开头有httphttps,则它是一个组,然后网站地址是另一个组。

用于测试目的

  Dim regex As Regex = New Regex("^(https?:\/\/)?([\da-z\.-]+)([a-z\]{2,6})([\/\w \.-]*)")
  Dim m As Match = regex.Match(txtURL.Text.Trim)
  Dim lst As New List(Of String)

  Do While m.Success
      For i = 1 To 2
          Dim g As Group = m.Groups(i)
          lst.Add(g.ToString)
      Next
      Exit Do
  Loop

  ' Jump through hoops to account for one or two groups.
  If lst.Count = 1 Then
      txtConvertedURL.Text = (lst(0))
  ElseIf lst.Count = 2 Then
      txtConvertedURL.Text = (lst(0) & lst(1))
  End If

2 个答案:

答案 0 :(得分:2)

您可以使用外部分组来实现此目的:

Dim regex As Regex = New Regex("^((https?:\/\/)?([\da-z\.-]+)([a-z]{2,6}))([\/\w \.-]*)")
'                                ^                                       ^
Dim m As Match = regex.Match(txtURL.Text.Trim)
Dim lst As New List(Of String)

Do While m.Success
    For i = 1 To 2
        Dim g As Group = m.Groups(i)
        lst.Add(g.ToString)
    Next
    Exit Do
Loop

If lst.Count > 1 Then
    txtConvertedURL.Text = (lst(0))
End If

修改

@Jasen和我同时回答:关于那里仍然有多个小组,但他们中的第一个是你想要的全部比赛。

同样,我在Jasen的回答评论中指出的ArgumentException最终归结为问题原始模式[a-z\]内的反斜杠(一次额外的parens) - 虽然平衡 - 被介绍了)。回到问题的原始语言(“......一直到一个反斜杠。”),\内的[a-z\]没有明显的意义 - 当然不是关系到问题中的示例输入网址。

单个转发斜杠而不是反斜杠表示URL当然是主机/域的结尾;以及\/中的([\/\w \.-]*)代表了这一点:原始模式中[a-z\]内的反斜杠似乎是错误的:我已将其放入更新后的答案中,该答案会为样本生成所需的输出输入提供。

答案 1 :(得分:0)

在小组周围加上括号:

^((https?:\/\/)?([\da-z\.-]+)([a-z\]{2,6}))([\/\w \.-]*)

您仍会获得多个群组,但第一个群组将是协议和域

顺便说一句,正则表达式今年停止了工作。 TLD不再限于6个字符。 如果有人给你,请抱怨。

失去了' 6'并且它会更好地工作

^((https?:\/\/)?([\da-z\.-]+)([a-z\]{2,}))([\/\w \.-]*)