使用正则表达式连接不同数量的行

时间:2013-12-04 20:02:38

标签: regex

我将发布我的问题的简化版本,如果您想了解更多细节,请告诉我。

我有一个包含类似于日志文件的文本的平面文本文件。它包含541行,以9位数字开头,后跟各种数据位。其中一些数据是XML,其中大部分包含额外的新行字符,导致这些行被拆分,现在文件大约为30k行。我想将这个文件连接回541行,基本上将任何不以9位数字开头的行合并到上一行。

首先,9位数字以“11”开头,所以我在11\d{7}上进行了匹配,得到了我的541个匹配项(即我的文件中没有匹配的数字可能不正确匹配)。我还能够将所有不以此号码开头的行与^(?!11\d{7})(.|\n)*$匹配。我想将所有这些线连接在一起,并将其粘贴到线之前(这是以11 \ d {7}开头的线)。我在网上的搜索只找到了有限和/或一致数量的行连接的解决方案,但这种XML的长度和结构各不相同。最后,此文件中的XML 跨行拆分,因此不加区别地匹配和合并所有XML也不是一种选择。建议非常感谢。这是一个例子来说明我正在尝试做的事情:

在:

117337909,some text,42930842,misc data,<xmlRoot>
<parent1>
<foo>data</foo>
<bar>123</bar>
</parent1>
</xmlRoot>
116425348,some more text,2df34as,blah,<xmlRoot>
<parent2>
<foo>data</foo>
<bar>123</bar>
</parent2>
</xmlRoot>

后:

117337909,some text,42930842,misc data,<xmlRoot><parent1><foo>data</foo><bar>123</bar></parent1></xmlRoot>
116425348,some more text,2df34as,blah,<xmlRoot><parent2><foo>data</foo><bar>123</bar></parent2></xmlRoot>

3 个答案:

答案 0 :(得分:3)

您可以使用:

String result = yourstring.replaceAll("\\r?\\n(?!11\\d{7}(?!\\d))", "");

模式细节:

\\r?          # optional carriage return (for windows format) 
\\n           # line feed
(?!           # open a negative lookahead (ie: not followed by)
    11\\d{7}  # 11, seven digits
    (?!\\d)   # not followed by another digit (to ensure that there isn't more
              # digits after, "1123456789" will not match)
)             # close the lookahead

答案 1 :(得分:0)

只需搜索此正则表达式:

(?s)[\r\n]*(?!11\d{7})

并替换为空字符串,即""

答案 2 :(得分:0)

在Notepad ++中,您可以使用扩展搜索执行此操作。在引号内键入文本,而不是引号。

  1. 查找:"\r\n"替换:" " [空格]
  2. 查找:" (11\d\d\d\d\d\d\d)"替换:"\n\1"
  3. 如果您有其他以11开头的9位数字,这将无效,但如果您不这样做,这可能比在正则表达式中更容易。 Notepad ++不是很擅长从我读过的新行开始的正则表达式。