我试图匹配网址,到目前为止它的工作效果很好 - 除了我有多个网站。如果可以,我想得到一个小组。我的目标是将地址一直提升到单个(前进)斜杠。
例如,给定此URL
http://docs.oracle.com/javase/8/docs/technotes/guides/install/windows_jdk_install.html#BABGDJFH
输出将是:
http://docs.oracle.com
另外在另一方面,有时候开头http
或https
不存在;但它是可选的,反正我也不需要它。
当前的正则表达式我正在使用
^(https?:\/\/)?([\da-z\.-]+)([a-z\]{2,6})([\/\w \.-]*)
第一组是可选的,这意味着网址可以以http
或https
开头,也可以两者都不开头。其余的是域名本身。当我运行上面的正则表达式时,我会回到我需要的东西,但在更多的组中,而不仅仅是一个;而且我想得到一个小组。如果开头有http
或https
,则它是一个组,然后网站地址是另一个组。
用于测试目的
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
答案 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 \.-]*)