在VB.NET中,从不同字符串的部分创建一个字符串

时间:2010-01-28 10:16:34

标签: vb.net string

此字符串是使用我无法访问或更改的应用程序自动生成的: “http://www.site.com/locale=euen&mag=testit&issue=322&page=5&template=testit-t1

我需要将字符串更改为

http://www.site.com/322_5

其中:

  • http://www.site.com/ 来自上一个字符串
  • 322 来自 issue = 322
  • 5 来自第一个字符串中的 page = 5

但它也可能是一个不同的问题或页码,事先并不知道。

我如何在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)?

1 个答案:

答案 0 :(得分:2)

您想要regular expressions

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 = ^)是否与模式匹配。变量参数值全部编码为$,即几个字符≠[^&]+(这是参数的分隔符)。