查找并替换字符串中的特定字符
Find and replace specific characters in a string
假设我有一个名为 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>
所以它会导致:
<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>
然后删除换行符并将其替换为<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)
当前结果
~Header 1~<br/>*Content 1*<br/>*Content 2*<br/><br/>~Header 2~<br/>*Content 1*<br/>*Content 2*<br/>*Content 3*<br/><br/>~Header 3~<br/>*Content 1*
有人可以帮我吗?
假设“~”和“*”字符总是出现在行首和行尾,可以使用下面的方法
- 使用
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)
您可以利用正则表达式。
Function ReplaceSpecial(ByVal text As String) As String
text = Regex.Replace(text, "^~([^~]+?)~", "<b></b>", RegexOptions.Multiline)
text = Regex.Replace(text, "^\*([^*]+?)\*", "<p></p>", RegexOptions.Multiline)
Return text
End Function
正则表达式对这样的事情很有用:
Dim output As String = Regex.Replace(input, "~([^~]*)~", "<b></b>")
output = Regex.Replace(output, "\*([^*]*)\*", "<p></p>")
output = Regex.Replace(output, "\r?\n", "<br/>")
If 可以用单一模式完成整个操作,但您需要为其提供客户 MatchEvaluator
方法,这样会更复杂。所以,只要你不介意运行通过多次替换每次不同的模式,它更简单,更容易。
假设我有一个名为 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>
所以它会导致:
<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>
然后删除换行符并将其替换为<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)
当前结果
~Header 1~<br/>*Content 1*<br/>*Content 2*<br/><br/>~Header 2~<br/>*Content 1*<br/>*Content 2*<br/>*Content 3*<br/><br/>~Header 3~<br/>*Content 1*
有人可以帮我吗?
假设“~”和“*”字符总是出现在行首和行尾,可以使用下面的方法
- 使用
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)
您可以利用正则表达式。
Function ReplaceSpecial(ByVal text As String) As String
text = Regex.Replace(text, "^~([^~]+?)~", "<b></b>", RegexOptions.Multiline)
text = Regex.Replace(text, "^\*([^*]+?)\*", "<p></p>", RegexOptions.Multiline)
Return text
End Function
正则表达式对这样的事情很有用:
Dim output As String = Regex.Replace(input, "~([^~]*)~", "<b></b>")
output = Regex.Replace(output, "\*([^*]*)\*", "<p></p>")
output = Regex.Replace(output, "\r?\n", "<br/>")
If 可以用单一模式完成整个操作,但您需要为其提供客户 MatchEvaluator
方法,这样会更复杂。所以,只要你不介意运行通过多次替换每次不同的模式,它更简单,更容易。