【问题标题】:How to replace some part of this string with vb.net?如何用 vb.net 替换此字符串的某些部分?
【发布时间】:2013-12-20 12:48:12
【问题描述】:

我正在寻求创建正则表达式的帮助,以便我可以用锚标记替换文本。文本来自 SQL 字段 (VarChar(max)),格式如下:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua (1954, c. 12; 1968, c. 300; 1994, c. 98)

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua (1998, cc. 553, 568; 2001, c. 300)

在上面的文字中,我需要将 1994 年之后的所有章节替换为锚标签。因此,例如,98、553、568 和 300 都将被替换。以下代码查找 1994 年的整个文本,例如 c.98,但我不确定如何仅替换该文本中的“98”。

Public Shared Function ReplaceChapterTag1(lang As String) As String
    Dim l As String = lang
    Dim r As Regex = New Regex("199[4-9][/,][/ ][/c]*[/.][/ ][0-9]+(?:\.[0-9]*)?")

    Dim applyEvaluator As MatchEvaluator = New MatchEvaluator(AddressOf applyCodeLink)
    l = r.Replace(l, applyEvaluator)

    Return l

End Function

Private Shared Function applyCodeLink(ByVal m As Match) As String
    Dim r As Regex = New Regex("^[0-9]*[\-][0-9]*")
    Dim str As String = m.ToString
    Dim strReturn As String = ""

    Dim match As Match = r.Match(str)
    If match.Success Then
        strReturn = str
    Else
        strReturn = "<a href='link?id=" & m.Value & "'>" & m.Value & "</a>"
    End If

    Return strReturn
End Function

【问题讨论】:

    标签: .net regex vb.net


    【解决方案1】:

    解决方案

    我不确定如何仅替换该文本中的“98”。

    您可以使用Regex.Replace。但是,您构建的正则表达式需要像这样调整:

    (?<=199[4-9][^;]+)(?<=[/c]*[/.][/\x20]|,\x20)(\d+(?:\.\d*)?)(?=[,;)])
    

    说明

    示例代码

    ' Input
    Dim InputText As String = "..." ' Lorem ipsum...
    
    ' Regex
    Dim r As Regex = New Regex( _
          "(?<=199[4-9][^;]+)" + _
          "(?<=[/c]*[/.][/\x20]|,\x20)" + _
          "(\d+(?:\.\d*)?)" + _
          "(?=[,;)])", _
        RegexOptions.IgnoreCase _
        Or RegexOptions.CultureInvariant _
        Or RegexOptions.Compiled _
        )
    
    ' This is the replacement string
    Dim Replacement As String = "<a href='link?id=$1'>$1</a>"
    
    '' Replace the matched text in the InputText using the replacement pattern
    Dim Result As String = r.Replace(InputText,Replacement)
    

    输入

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua (1954, c. 12; 1968, c. 300; 1994, c. 98)

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua (1998, cc. 553, 568; 2001, cc. 17, 300)

    输出

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua (1954, c. 12; 1968, c. 300; 1994, c. <a href='link?id=98'>98</a>)
    
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua (1998, cc. <a href='link?id=553'>553</a>, <a href='link?id=568'>568</a>; 2001, cc. 17, 300)
    

    讨论

    基本上,在我的回答中调整正则表达式背后的想法是寻找一个或多个数字(\d+),它们前面和后面跟着一些字符。

    我冒昧地简化并明确了初始正则表达式。主要是我换了:

    • [0-9]\d
    • (space char)\x20

    【讨论】:

    • Alex,感谢您的出色工作,您已经完成了 95% 的工作!
    • Alex,想补充一点:1986,c。 617 1989,c。 119 (§§ 2.02, 9.03) 1993, c. 3 (§ 2.02) 1994, cc。 129, 239 (§§ 12.02, 12.05 [添加]) 2003, c. 873 (§§ 11.04, 11.05 [add]) Lorem ipsum dolor sit amet, consectetur (1986, c. 617; 1994, cc. 129, 239) Lorem ipsum dolor sit amet, consectetur (1986, c. 617; 2003, c . 873) -- 查找第一个 1994 年的匹配项,抄送。 129、239 和 2003,c。 873. 但随后它与 1986 年相匹配,c。第一段和第二段中的 617(以及第一段中的 1994 年值),但随后与 2003 年不匹配,c。 873 在第二段末尾。
    • @JohnS.Warrick 将您的评论作为新问题发布。
    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2018-07-14
    • 2017-08-30
    • 2014-03-27
    • 2023-03-04
    • 2017-08-30
    相关资源
    最近更新 更多