RegEx查找并替换为notepad ++

时间:2016-11-16 18:22:12

标签: regex notepad++

我正在尝试查找逗号后跟空格和包含和下划线的字符串,并替换为新行后跟匹配的字符串。

输入

ABC, ZYZ John_Doe 
HBB Dan_Doe
HHH, BBB, CCC April_May 

期望的输出

ABC John_Doe
ZYZ John_Doe
HBB Dan_Doe
HHH April_May
BBB April_May
CCC April_May

我正在使用Notepad ++和RegEx,我可以通过在查找中添加\s+并替换\n来替换逗号和空格,但仍然会匹配包含下划线的字符串并且在新线之后结束它。

非常感谢任何帮助

3 个答案:

答案 0 :(得分:2)

当你有一个逗号

时,这个正则表达式会起作用

查找: ^([A-Z]{3}), ([A-Z]{3}) ([A-Z][a-z].*)

替换为:\1 \3\n\2 \3

这将使用两个逗号

查找:^([A-Z]{3}), ([A-Z]{3}), ([A-Z]{3}) ([A-Z][a-z].*)

替换为:\1 \4\n\2 \4\n\3 \4

答案 1 :(得分:1)

请注意这是否是最佳方法,但我提出了以下模式:(?:(?:^|\G(?!^)\h*,\h*)([[:alnum:]]+\b)(?=(\h*,\h*[[:alnum:]]+)*\h+([[:alnum:]]+_[[:alnum:]]+\h*$))|(\h+[[:alnum:]]+_[[:alnum:]]+\h*$\R?)),将其替换为(?{1}$1 $3\n(?{2}~~:):),第二次替换为^~~并替换为空字符串。

它可以根据需要进行转换,可以使用任意数量的逗号。这就是它的作用:

(?:^|\G(?!^)\h*,\h*)([[:alnum:]]+\b)(?=(\h*,\h*[[:alnum:]]+)*\h+([[:alnum:]]+_[[:alnum:]]+)\h*$)

这匹配逗号分隔的字符串(以及前瞻中的下划线值)

  • (?:^|\G(?!^)\h*,\h*)匹配该行的开头,或上一个匹配后跟水平空格 逗号 水平空格
  • ([[:alnum:]]+\b)匹配字母/数字后跟字边界,存储到捕获组1
  • (?=开始前瞻,所以我们实际上并不匹配,只是断言并存储到捕获组中
  • (\h*,\h*[[:alnum:]]+)*匹配下一个单词,如果有任何后续内容并将最后一个存储到捕获组2中,如果没有后续单词,则捕获组2不匹配
  • \h+([[:alnum:]]+_[[:alnum:]]+)\h*$匹配下划线的单词,将其捕获到第3组,之前有水平空格,可能在之后

(\h+[[:alnum:]]+_[[:alnum:]]+\h*$\R?))

这与下划线的单词以及可选的以下换行符匹配,因此我们可以用空字符串替换它。

替换(?{1}$1 $3\n(?{2}~~:):)检查第一个捕获组是否匹配(因此是逗号分隔的单词之一)。如果是这样,它会在空格中插入一个空格,下划线的单词,换行符和~~,如果它不是最后一个。我需要~~使\G在所有情况下都能正常工作,您可以使用任何不太可能重新出现在内容中的字符串。如果第一个捕获组不匹配,则替换将为空。使用^~~的第二个替换用于最终删除它。

答案 2 :(得分:1)

使用以下正则表达式 N 次,其中 N 是同一行中逗号的最大数量:

, ([A-Z]*)( \w*)

替换为:

$2\r\n$1$2

这是一个有用的site用于测试。

示例:

从您发布的输入文本开始,您必须使用两次正则表达式:

ABC, ZYZ John_Doe
HBB Dan_Doe
HHH, BBB, CCC April_May

这将是第一次执行的结果:

ABC John_Doe
ZYZ John_Doe
HBB Dan_Doe
HHH, BBB April_May
CCC April_May

这将是第二个结果:

ABC John_Doe
ZYZ John_Doe
HBB Dan_Doe
HHH April_May
BBB April_May
CCC April_May