此字符串是使用我无法访问或更改的应用程序自动生成的: “http://www.site.com/locale=euen&mag=testit&issue=322&page=5&template=testit-t1”
我需要将字符串更改为
其中:
但它也可能是一个不同的问题或页码,事先并不知道。
我如何在VB.NET中执行此操作? (它必须是VB.NET)我已经尝试过拆分和比较,但我解密字符串是一场灾难。非常欢迎帮助!
编辑:
在尝试下面的Konrad解决方案后,当我尝试通过它运行字符串时出现错误。所有其他URL保持正常工作,但只要我将其中的一个放入需要转换的格式,它就会出错。
我怀疑这是因为转换函数是另一个函数的一部分,并且在尝试将正则表达式函数放入时我做错了。 这是完整的功能:
Function ExpandLine(ByRef sLine, ByVal nStart)
'Purpose: adapt expandLine into a funciton that replaces
' ' the urls form the UNIT with redirects
' '
' ' Purpose: This function searches recursively
' ' for strings embedded in "{" and "}" pairs.
' ' These strings contain a left and right part
' ' separated by ";". The left part will be
' ' hyperlinked with the right part.
' '
' ' Input: sLine - string to be expanded
' ' nStart - where to start the expansion from
' ' the right (normally set to -1)
' '
' ' Output: sLine - expanded string
' '
' ' Example: This line contains a {hyperlink;http://www.site.com}
' ' that points to the homepage
Dim n, n1, n2 As Integer
Dim sUrl As String
If nStart <> 0 Then
n = InStrRev(sLine, "{", nStart)
If n <> 0 Then
n1 = InStr(n, sLine, ";")
n2 = InStr(n, sLine, "}")
If Not (n1 = 0 Or n2 = 0) Then
sUrl = Mid(sLine, n1 + 1, n2 - n1 - 1)
'use RegEx to determine if its an UNIT url
Const TestPattern = _
"^http://[^/]+/locale=[^&]+&mag=[^&]+&issue=[^&]+&page=[^&]+&template=[^&]+$"
Dim conformsToPattern = Regex.IsMatch(sUrl, TestPattern)
If conformsToPattern Then
Const SitePattern = "(http://[^/]+)/"
Const IssuePattern = "issue=(\d+)"
Const PagePattern = "page=(\d+)"
Dim sSite = Regex.Match(sUrl, SitePattern).Groups(1).Value
Dim sIssue = Regex.Match(sUrl, IssuePattern).Groups(1).Value
Dim sPage = Regex.Match(sUrl, PagePattern).Groups(1).Value
sUrl = String.Format("{1}/{2}_{3}", sSite, sIssue, sPage)
End If
sLine = _
Left(sLine, n - 1) & "<a class=""smalllink"" target=""_new"" href=""" & _
sUrl & """>" & Mid(sLine, n + 1, n1 - n - 1) & "</a>" & _
Right(sLine, Len(sLine) - n2)
ExpandLine(sLine, n - 1)
End If
End If
End If
End Function
问题出在以下一行吗?
sUrl = String.Format("{1}/{2}_{3}", sSite, sIssue, sPage)?
答案 0 :(得分:2)
Const SitePattern = "(http://[^/]+)/"
Const IssuePattern = "issue=(\d+)"
Const PagePattern = "page=(\d+)"
Dim site = Regex.Match(input, SitePattern).Groups(1).Value
Dim issue = Regex.Match(input, IssuePattern).Groups(1).Value
Dim page = Regex.Match(input, PagePattern).Groups(1).Value
Dim result = String.Format("{1}/{2}_{3}", site, issue, page)
分别搜索网站域名(包括前导http://
,并由第一个后续正斜杠分隔),issue
参数后面的数字和数字在page
参数之后。
然后从这三个发现中构造结果字符串。
通过\d+
搜索正则表达式中的数字,其中\d
匹配任何数字,+
告诉引擎至少匹配一个,并且任意多个。
对于网站,我们允许任何字符,除正斜杠([^/]
- 这是一个字符组和前导{{1} }告诉引擎否定组,即匹配不在其中的所有内容。)
编辑:如果您首先要测试输入是否符合您的模式,则可以执行以下操作。但请注意,此测试敏感符合GET参数的顺序,我将此作为警告标志以不同方式执行:因为URL中的GET参数顺序不是重要的是,你能保证会保持不变吗?
^
这只是检查整个字符串(从start = Const TestPattern = "^http://[^/]+/locale=[^&]+&mag=[^&]+&issue=[^&]+&page=[^&]+&template=[^&]+$"
Dim conformsToPattern = Regex.IsMatch(input, TestPattern)
If conformsToPattern Then
' Yes, go ahead. '
Else
' Nope, leave it unchanged. '
End If
到end = ^
)是否与模式匹配。变量参数值全部编码为$
,即几个字符≠[^&]+
(这是参数的分隔符)。