[英]Multiple groups instead of one
我正在嘗試匹配URL,到目前為止,它工作得很好–除了我得到了多個組之外。 如果可以的話,我想參加一個小組。 我的目標是使地址一直到單個(正)斜線。
例如,給定此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 \.-]*)
第一組是可選的,這意味着URL可以以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
您可以使用外部分組來實現此目的:
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
最終下降到問題原始模式中的[az\\]
中的反斜杠(一旦引入了其他括號,盡管是平衡的)。 綁回到問題的原始語言(“......一路攀升到一個反斜杠。”),在\\
內[az\\]
不作(明顯)感覺-當然不是相對於樣品輸入網址在這個問題上。
當然,單個正斜杠而不是反斜杠將指示URL中主機/域的結尾; 和\\/
在([\\/\\w \\.-]*)
隨后為該帳戶:內的反斜杠[az\\]
在原有的模式,然后似乎錯誤:我在更新的答案產生所需的輸出把它丟提供的樣本輸入。
在各組之間加上括號:
^((https?:\/\/)?([\da-z\.-]+)([a-z\]{2,6}))([\/\w \.-]*)
您仍然會獲得多個組,但是第一個組將是協議和域
順便說一句,該正則表達式今年停止工作。 TLD不再限於6個字符。 請抱怨給誰的人。
失去“ 6”,它會更好地工作
^((https?:\/\/)?([\da-z\.-]+)([a-z\]{2,}))([\/\w \.-]*)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.