查找并替换字符串中的特定字符

时间:2016-02-03 12:06:48

标签: .net vb.net vb.net-2010

假设我有一个名为Select distinct item_no from location where location_no not in (100) 的字符串变量,其中包含以下值:

str

我想要的是将~Header 1~ *Content 1* *Content 2* ~Header 2~ *Content 1* *Content 2* *Content 3* ~Header 3~ *Content 1* ~<b>Header</b>的特殊字符替换为*,这样会导致:

<p>Content</p>

然后删除NewLine并将其替换为<b>Header 1</b> <p>Content 1</p> <p>Content 2</p> <b>Header 2</b> <p>Content 1</p> <p>Content 2</p> <p>Content 3</p> <b>Header 3</b> <p>Content 1</p> 并将其设置为一行。

到目前为止,我可以删除NewLine并将其替换为<br/>,然后只需一行。

预期结果

<br/>

我的当前代码

<b>Header 1</b><br/><p>Content 1</p><br/><p>Content 2</p><br/><br/><b>Header 2</b><br/><p>Content 1</p><br/><p>Content 2</p><br/><p>Content 3</p><br/><br/><b>Header 3</b><br/><p>Content 1</p>

当前结果

Dim str As String = TextBox.Text ' The String Value is inputted from TextBox with Multiline property

Dim newStr As String = Regex.Replace(str, vbLf, "<br/>")
newStr = Regex.Replace(str, vbCr, "<br/>")
MessageBox.Show(newStr)

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

假设“〜”和“*”字符始终出现在行的开头和结尾,您可以使用以下方法

  • 使用String.Split为每行str创建一个包含一个元素的数组。
  • 循环划线并进行替换。
  • 使用String.Join重建每个项目之间<br>的字符串。

    Dim str As String = "~Header~" & vbCrLf & "*content*"
    Dim lines() As String = str.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
    For i As Integer = 0 To lines.Length - 1
        If lines(i).StartsWith("~") And lines(i).EndsWith("~") Then
            lines(i) = "<b>" & lines(i).Substring(1, lines(i).Length - 2) & "</b>"
        End If
    
        If lines(i).StartsWith("*") And lines(i).EndsWith("*") Then
            lines(i) = "<p>" & lines(i).Substring(1, lines(i).Length - 2) & "</p>"
        End If
    Next
    Dim strNew As String = String.Join("<br>", lines)
    

[编辑以回复评论]

如果您希望为每个空白行添加<br>,那么我们需要将StringSplitOptions更改为StringSplitOptions.None。为此,我们需要确切地知道哪些字符或字符分隔行(vbCR,vbLf,vbCrLf),如果行由vbCrLf分隔,则以下代码应该有用。

    Dim str As String = "~Header~" & vbCrLf & "*content*"
    Dim lines() As String = str.Split({vbCrLf}, StringSplitOptions.None)
    For i As Integer = 0 To lines.Length - 1
        If lines(i).StartsWith("~") And lines(i).EndsWith("~") Then
            lines(i) = "<b>" & lines(i).Substring(1, lines(i).Length - 2) & "</b>"
        End If

        If lines(i).StartsWith("*") And lines(i).EndsWith("*") Then
            lines(i) = "<p>" & lines(i).Substring(1, lines(i).Length - 2) & "</p>"
        End If
    Next
    Dim strNew As String = String.Join("<br>", lines)

答案 1 :(得分:2)

正则表达式对于这样的事情很有用:

Dim output As String = Regex.Replace(input, "~([^~]*)~", "<b>$1</b>")
output = Regex.Replace(output, "\*([^*]*)\*", "<p>$1</p>")
output = Regex.Replace(output, "\r?\n", "<br/>")

如果可以使用单一模式执行整个操作,但您需要为其提供客户MatchEvaluator方法,这将更复杂。因此,只要您不介意每次使用不同的替换方式运行多个模式,它就会更简单,更容易。

答案 2 :(得分:0)

您可以使用正则表达式。

Function ReplaceSpecial(ByVal text As String) As String
    text = Regex.Replace(text, "^~([^~]+?)~", "<b>$1</b>", RegexOptions.Multiline)
    text = Regex.Replace(text, "^\*([^*]+?)\*", "<p>$1</p>", RegexOptions.Multiline)
    Return text
End Function