使用先前捕获的令牌为多行添加前缀

时间:2014-02-23 19:57:48

标签: regex notepad++ pcre

我正在寻找一个搜索/替换正则表达式,它将捕获令牌并将其作为前缀应用于文档中的每个后续行。

所以这个..

Tokens always start with ##..
Nothing is prefixed until a token is encountered..
##CAT
furball
scratch
##DOG
egg
##MOUSE
wheel
on the stair

变为..

Tokens always start with ##..
Nothing is prefixed until a token is captured!
##CAT
CAT furball
CAT scratch
##DOG
DOG egg
#MOUSE
MOUSE wheel
MOUSE on the stair

3 个答案:

答案 0 :(得分:2)

您可以使用此模式:

search: ((?:\A|\n)##([^\r\n]+)(?>\r?\n\2[^\r\n]+)*+\r?\n(?!##))
replace: $1$2        <= with a space at the end

但是你必须多次应用搜索替换,直到没有更多的匹配。

答案 1 :(得分:0)

据我所知,这是不可能的。我能得到的最接近的是

^##(.*)\r?\n(.*)

##\1\n\1 \2

输出:

Tokens always start with ##..
Nothing is prefixed until a token is encountered..
##CAT
CAT furball
scratch
##DOG
DOG egg
##MOUSE
MOUSE wheel
on the stair

答案 2 :(得分:0)

你有pcre标签和Notepad ++标签 没有回调机制,我认为你不能真正做到这一点 话虽如此,你可以在没有回调的情况下做到,但你需要划分 功能。

这是一个php示例,可能会给你一些想法 注意 - 不确定php字符串连接语法(使用'。'但它可能是'+') 用法是多行模式//m修饰符。

 ^                     # Begin of line
 (?-s)                 # Modifier, No Dot-All
 (?:
      (                     # (1 start)
           \#\#                  # Token indicator
           ( \w+ )               # (2), Token
           .*                    # The rest of line
      )                     # (1 end)
   |                      # or,
      ( .* )                # (3), Just a non-token line
 )
 $                     # End of line 

 # $token = "";
 # $str = preg_replace_callback('/^(?-s)(?:(\#\#(\w+).*)|(.*))$/m',
 #                    function( $matches ){
 #                         if ( $matches[1] != "" ) {
 #                              $token = $matches[2];
 #                              return $matches[1];
 #                         }
 #                         else
 #                         if ( $token != "" ) {
 #                             return $token . " " . $matches[3];
 #                         }
 #                         return $matches[3];
 #                    },
 #                    $text);
 #