条件正则表达式替换字符串不在初始表达式中的位置

时间:2016-09-26 09:47:29

标签: regex replace notepad++

我将举几个例子,因为我认为这是描述我想要的最佳方式,但基本上我只想保留数字,但根据第一个数字(1或2:AAA)将文本添加到开头。 ,3:BBB,4或5:XYZ):

INITIAL STRINGS:

Blah 12345 Blah
Blah 22345 Blah
Blah 32345 Blah
Blah 42345 Blah
Blah 52345 Blah

结果:

AAA12345
AAA22345
BBB32345
XYZ42345
XYZ52345

正则表达式搜索:

([0=9])([0-9]{4})

正则表达式替换为:

(SOME WAY OF DECIDING BETWEEN AAA|BBB|XYZ depending on \1!)\1\2

这可能吗?

3 个答案:

答案 0 :(得分:4)

使用Notepad ++似乎确实有办法实现这一点,因为它支持条件替换,这在此问题的接受答案中有详细说明:How to use conditionals when replacing in Notepad++ via regex

但请注意,为每个案例进行多次查找/替换可能更容易,更快......

答案 1 :(得分:4)

您不需要在此使用正则表达式条件功能(即:(?(condition)true|false)

你可以用你需要的数据创建一个虚假的最后一行(最后没有换行符):

Blah 12345 Blah
Blah 22345 Blah
Blah 32345 Blah
Blah 42345 Blah
Blah 52345 Blah
AAA#BBB#XYZ

并使用此模式:

^[^0-9\n]*(?:((?|[12](?=(?>.*\n)*([^#]+))|3(?=(?>.*\n)*[^#]*#([^#]+))|[45](?=(?>.*\n)*(?:[^#]*#){2}([^#]+)))\d+).*|.*\z)

这个替代品:

$2$1

demo

模式细节:

^ # start of a line
[^0-9\n]* # all that isn't a digit
(?:
    ( # first capture group for the number
        (?| # branch reset: all capture have the same number inside (2 here)
            [12]
            (?= # lookahead to reach the good string
                (?>.*\n)* # reach the last line
                ([^#]+)   # capture the first string
            )
          |
            3
            (?=
                (?>.*\n)*
                [^#]*#    # skip the first string
                ([^#]+)   # capture the second
            )
          | # same thing
            [45](?=(?>.*\n)*(?:[^#]*#){2}([^#]+))
        ) # close the branch reset group
        \d+
     ) # close the capture group 1
     .* # match the end of the line
  |
    .*\z # match the last line
)

答案 2 :(得分:2)

使用

^.* ((?:([12])|(3)|([45]))\d{4}) .*

并替换为

(?2AAA:(?3BBB:XYZ))$1

模式匹配:

  • ^ - 行首
  • .* - 除了换行符之外的零个或多个字符
  • ((?:([12])|(3)|([45]))\d{4}) - 一个空格,1个特定数字(12 - 第2组,3 - 第3组,4 - 第4组,以及另外4位数
  • .* - 其余部分

替换模式详细信息

  • (?2 - 如果第二组匹配,
    • AAA - 添加AAA
    • : - 或
    • (?3 - 如果第3组匹配,
      • BBB - 插入BBB
      • : - 或
      • XYZ - 插入XYZ
    • )
  • )
  • $1 - 并插入第1组内容(整个5位数字)。

enter image description here