我有一个长字段,其中包含类似这样的字符串:
1-脚本2-白色3- EMB-1 4- * 5- * 6-彼得森太太7-爱8-彼得森先生9- * 10- * 11- * 12- 9990007878 13-由客户输入:Flash App 14- 15- 71 16- 849b5629d0144e3c8293200910742e0d
我需要找到一种操作字符串的方法,并将其格式化为:
1- SCRIPT
2-白色
3- EMB-1
4- *
5- *
6-彼得森太太
7-喜欢
8-彼得森先生
9- *
10- *
11- *
12- 9990007878
13-由客户输入:Flash App
14-
15-71
16- 849b5629d0144e3c8293200910742e0d
表示新字段开头的字符是数字+' - '序列我想。
答案 0 :(得分:1)
这里有两个选项,具体取决于您是否需要保留前缀数字,您有两个选项。对于两者,我使用正则表达式来帮助检测每个字段的边界。
这里是基础正则表达式:
\d+-\s
正则表达式查找一个或多个数字(0-9),连字符,然后是空格。这符合您提供的模式。
0- Test -- MATCH
1 - Test -- No Match, space between the integer and hyphen.
9999-ABC -- No Match, there is not a space between the hyphen and the value.
选项1
这将从字符串中删除前缀。
Dim str As String = "1- SCRIPT 2- WHITE 3- EMB-1 4- * 5- * 6- Mrs. Petersen 7- loves 8- Mr. Petersen 9- * 10- * 11- * 12- 9990007878 13- Entered by customer: Flash App 14- 15- 71 16- 849b5629d0144e3c8293200910742e0d"
Dim items = Regex.Split(str, "\d+-\s", RegexOptions.None, New TimeSpan(0, 0, 30))
选项2 这会保留前缀,并将值放入组中以便于访问。
使用负面外观后,这种方法的正则表达式稍微复杂一些。这使得我们可以确定我们捕获的值是否是字段值的一部分。
编辑我更改了此选项以使用StringBuilder重建带有分隔字符的字符串。这来自下面的评论。
Dim str As String = "1- SCRIPT 2- WHITE 3- EMB-1 4- * 5- * 6- Mrs. Petersen 7- loves 8- Mr. Petersen 9- * 10- * 11- * 12- 9990007878 13- Entered by customer: Flash App 14- 15- 71 16- 849b5629d0144e3c8293200910742e0d"
Dim matches = Regex.Matches(str, "(?<fieldNumber>\d+)-\s(?<fieldValue>(?:(?!\d+-\s).)*)", RegexOptions.None, New TimeSpan(0, 0, 30))
Dim sb As New StringBuilder
For Each match As Match In matches
sb.AppendFormat("{0}\n", match.Value)
Dim matchedString = match.Value
Dim fieldNumber = match.Groups("fieldNumber").Value
Dim fieldValue = match.Groups("fieldValue").Value
Next
Dim entireString = sb.ToString()
修改强>
根据您的评论,您似乎只想在字段之间添加换行符。这是一个简单的方法。
Dim ret = Regex.Replace(str, "(\d+-\s(?:(?!\d+-\s).)*)", "$1\n", RegexOptions.None).Trim()
<强> RESPONSE * 强> (只是要明确,本节来自OP)
我以这种方式添加了您的代码:
DirectCast(e.Item.FindControl("litNote"), Literal).Text = Regex.Replace(product.Note, "(\d+-\s(?:(?!\d+-\s).)*)", "$1\n", RegexOptions.IgnorePatternWhitespace)
当我运行页面时,这就是我所看到的(使用稍微不同的字符串):
1-符号1 - 测试线1 \ n 2-符号1 - 测试线2 \ n 3-符号1 - 测试线3 \ n 4-符号1 - 测试线4 \ n 5-符号1 - 测试线5 \ n 6-电话:1111111111 \ n 7-由客户输入\ n 8-注释:这是对标志1的测试\ n 9-5线路标志,风格:98 \ n 10- SKU:10140,数量:1 n 11- ee69ef2aff024a458488de10f498ac10 \ n
修改
我想我需要更换:&#34; $ 1 \ n&#34;
使用:&#34; $ 1&lt; br /&gt;&#34;
编辑回复
您是对的,根据您返回输出的位置,您可能需要<br/>
而不是\n
。我不确定你是否使用<pre>
标签。所以我只是做了一个假设。
您还提到了您对正则表达式的解释:
(\d+ -- look for one or more digits (0-9)
- -- look for a hyphen
\s -- look for a space
(?: -- start a non-capturing group
(?!\d+-\s). -- do a negative look behind to see if we're inside of the delimited portion
)* -- capture zero or more characters that satisfy the negative look behind (this and the negative look behind is the magic. It's what stops the match so that the next field can start)
)
如果您不熟悉正则表达式,那么我建议您阅读基础知识,以便所有这一切都有意义。
一个很好的参考网站 http://www.regular-expressions.info/
这里有关于背后外观的部分可能是正则表达式中令人困惑的部分: http://www.regular-expressions.info/lookaround.html
嗨Nathan
到目前为止,我正在实施您的选项#2
Dim str As String
Dim sb As New StringBuilder
Dim fieldNumber As String
Dim fieldValue As String
str = product.Note
Dim matches = Regex.Matches(str, "(?<fieldNumber>\d+)-\s(?<fieldValue>(?:(?!\d+-\s).)*)", RegexOptions.None)
For Each match As Match In matches
fieldNumber = match.Groups("fieldNumber").Value
fieldValue = match.Groups("fieldValue").Value
sb.AppendFormat("{0}<br />", fieldValue)
Next
DirectCast(e.Item.FindControl("litNote"), Literal).Text = sb.ToString()
我很难理解如何能够操纵进入的内容的价值&#34; fieldNumber&#34;
以下是我认为您正在尝试做的事情。你想要做的样式只需parse fieldNumber到int,然后你可以用它来确定你所在的字段。
Dim str As String
Dim sb As New StringBuilder
Dim fieldNumber As String
Dim fieldValue As String
str = product.Note
Dim matches = Regex.Matches(str, "(?<fieldNumber>\d+)-\s(?<fieldValue>(?:(?!\d+-\s).)*)", RegexOptions.None)
For Each match As Match In matches
fieldNumber = match.Groups("fieldNumber").Value
fieldValue = match.Groups("fieldValue").Value
sb.AppendFormat("<p><label>{0}</label><span>{1}</span></p>", fieldNumber, fieldValue)
Next
DirectCast(e.Item.FindControl("litNote"), Literal).Text = sb.ToString()