如何拆分长字符串并为每个字段添加换行符

时间:2014-11-05 21:22:09

标签: asp.net vb.net

我有一个长字段,其中包含类似这样的字符串:

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

表示新字段开头的字符是数字+' - '序列我想。

1 个答案:

答案 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()