RegEx比较59个选项卡之间的任何字符

时间:2014-06-24 15:07:08

标签: regex notepad++

我最近收到了一个包含60个字段的制表符分隔文件。每个字段都可以包含任何字符。我收到的出口也有一些领域的换行和回车。这导致选项卡分隔文件无法正确导入。如果该行没有59个标签,是否有办法删除换行符和回车符?每个标签之间可能有也可能没有数据。

Sample File

第3,4,5行是我试图解决的问题。

3 个答案:

答案 0 :(得分:1)

警告:我假设列数据中没有标签。如果有,那么你需要的东西比我在这里的能力更强大。

以下适用于sample input provided

首先,使用不会在文件中的任何位置出现的字符替换所有换行符。您甚至可以使用无法用键盘输入的字符。

找到:(\r\n?|\n)

替换为:\xB6

然后,匹配60个字段的行并为它们提供换行符(我将使用Windows风格):

找到:^(([^\t]*\t){59}[^\t\xB6]*)\xB6

替换为:$1\r\n

我在这里做了一个很大的假设:第60列永远不会包含换行符。如果这是错误的,那么您将会在下一条记录的第1列中以某些第60列的数据结束。

现在,如果您不喜欢在数据中显示该段落符号,您可以清除它或用您喜欢的任何内容替换它:

找到:\xB6

替换为:

匹配模式的说明:

(\r\n?|\n)匹配三种换行符中的任何一种,即单\r,单\n或Windows风格\r\nWikipedia has a whole article about this

请参阅http://regex101.com/r/iB6fK9以探索^(([^\t]*\t){59}[^\t\xB6]*)\xB6模式。

  • 我在开头与^匹配行的开头。
  • 我有一组零个或多个不是标签的字符,后跟一个标签,我与([^\t]*\t){59}完全匹配59次。这让我们得到了前59个以制表符分隔的列。此组仅捕获第59列。
  • 对于第60列,我匹配的零个或多个字符既不是标签,也不是我们的特殊字符[^\t\xB6]*
  • 我用括号捕获60列,但是我将我们的特殊字符留在捕获的组之外,以便用\r\n替换插入的$1\r\n替换它。

答案 1 :(得分:0)

我从您的问题中了解到,您要从文件中删除\r\n窗口,为此,您可以使用替换对话框ctrl+h

Search Mode选择Extended (\n, \r,...上,然后在{查看内容'查找\r\n并在“替换”中将其留空(或将其替换为您想要的内容)。< / p>

答案 2 :(得分:0)

我做:

找到:^((?:[^\t]*\t[^\t]*){1,58})[\r\n]+
替换为:$1

如果一行中出现\t个字符少于59个,这将取代换行符。