记事本++ - 尝试重新格式化一些东西

时间:2011-06-19 22:34:19

标签: regex notepad++

我有一个基本上包含以下行的CSV:

06444|WidgetAdapter 6444|Description:

Here is a description.
Maybe some more.
|0

第三个字段中的文字总是不同且不同,我试图仅用<br>替换其中的所有换行符,因此它最终为

06444|WidgetAdapter 6444|Description: <br>Here is a description.<br>Maybe some more.<br>|0

编辑:

我基本上需要摆脱所有的换行符,所以每一行都是正确的VALUE | VALUE | VALUE | VALUE。标准化/美化/清洁它。

我的所有工具都无法正确导入,phpMyAdmin chokes等。 字段内有换行符,有双重引号未转义等等。

其他字段示例:

08681|Book 08681|"Testimonial" - Person

You should buy this.|

另一个字段的示例:

39338|Itemizer||

2 个答案:

答案 0 :(得分:1)

如果您知道有4列,则可以轻松解析数据。例如,这是一个PHP行,它产生一个包含所有数据的数组。数组中的每一行都是另一个包含所有捕获组的数组:[0]包含完整匹配,[1] - [4]包含每列:

$pattern = '/^([^|]*)\|([^|]*)\|([^|]*)\|([^|]*)$/m';
preg_match_all($pattern, $data, $matches, PREG_SET_ORDER);

模式非常简单:它需要4个值(不是管道符号),由3个管道分隔。获得数据后,您可以轻松地按照自己的方式重建数据,例如使用nl2br 请注意,如果第一列和最后一列也包含新行,则无法可靠地解析数据。

工作示例:http://ideone.com/gG0K3

答案 1 :(得分:1)

如果需要,可以使用正则表达式来定位这些换行符。我们的想法是只查找后跟一个额外值的换行符,然后只查找整行。我们可以在当前换行符为1模4后检查值的数量,因此我们知道我们在第3列:

(?:\r\n?|\n)(?=[^|]*\|[^\n\r|]*\s*(?:^(?:[^|]*\|){3}[^\n\r|]*$\s*)*\Z)

或者,(某些)解释:

(?:\r\n?|\n)   # Match a newline
(?=            # that is before...
    [^|]*\|[^\n\r|]*\s*               # one more separator and value
    (?:^(?:[^|]*\|){3}[^\n\r|]*$\s*)* # and some lines with 4 values.
    \Z                                # until the end of the string.
)

我无法在Notepad ++上工作(它甚至不匹配[\r\n]),但它似乎在其他引擎上运行良好: