Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RegEx以字符串的最后一次出现开始_Regex_Notepad++ - Fatal编程技术网

RegEx以字符串的最后一次出现开始

RegEx以字符串的最后一次出现开始,regex,notepad++,Regex,Notepad++,我有一个文本文件,其中有一个数据集,我想从中删除一些记录。看起来是这样的: =分隔符= 数据 unwantedKeyword 数据 =分隔符= 数据 wantedKeyword 数据 =分隔符= 数据 unwantedKeyword 数据 =分隔符= 数据 wantedKeyword 数据 =分隔符= 我可以使用某个关键字来标识我不想要(或想要)的记录。我想使用正则表达式,利用这个关键字和分隔符字符串删除所有这些表达式。 删除记录的“底部”部分效果很好,但当我尝试使用以下方法删除“顶部”位时:

我有一个文本文件,其中有一个数据集,我想从中删除一些记录。看起来是这样的:

  • =分隔符=
  • 数据
  • unwantedKeyword
  • 数据
  • =分隔符=
  • 数据
  • wantedKeyword
  • 数据
  • =分隔符=
  • 数据
  • unwantedKeyword
  • 数据
  • =分隔符=
  • 数据
  • wantedKeyword
  • 数据
  • =分隔符=
  • 我可以使用某个关键字来标识我不想要(或想要)的记录。我想使用正则表达式,利用这个关键字和分隔符字符串删除所有这些表达式。 删除记录的“底部”部分效果很好,但当我尝试使用以下方法删除“顶部”位时:

    =分隔符=.*unwantedKeyword

    匹配的开始位置是第一个可用的=分隔符=(第5行),而不是结束关键字(第11行)之前的最后一个(第9行),从而删除想要的记录

    是否可以只匹配该字符串的最后一个实例(=模拟数据中的分隔符=),因此只匹配第1行。到3。和9。到10岁。而不是1。到3。五,。到11岁。会被取代吗

    编辑:


    还是让它反向读取文件?Notepad++为RegEx-tho禁用了该选项,因此不确定是否可行。

    如果要删除第1行到第3行和第9行到第11行,可以使用前瞻来防止匹配所有以
    =separator=
    开头或包含unwantedKeyword的行

    ^=separator=.*(?:\R(?!(?:=separator=|.*?\bunwantedKeyword\b)).*)*\R.*?\bunwantedKeyword\b.*\R*
    

    我会用

    (?s)=separator=(?:(?!=separator=).)*?unwantedKeyword
    

    解释

    --------------------------------------------------------------------------------
      (?s)                     set flags for this block (with . matching \n) 
    --------------------------------------------------------------------------------
      =separator=              '=separator='
    --------------------------------------------------------------------------------
      (?:                      group, but do not capture (0 or more times
                               (matching the least amount possible)):
    --------------------------------------------------------------------------------
        (?!                      look ahead to see if there is not:
    --------------------------------------------------------------------------------
          =separator=              '=separator='
    --------------------------------------------------------------------------------
        )                        end of look-ahead
    --------------------------------------------------------------------------------
        .                        any character
    --------------------------------------------------------------------------------
      )*?                      end of grouping
    --------------------------------------------------------------------------------
      unwantedKeyword          'unwantedKeyword'
    

    为什么分隔符是第一位,不需要的关键字是第二位,反之亦然?这只是去掉了记录的“底部”部分,所以在本例中,第3到5行和第11到13行保持第2行和第10行不变。这很好,是我需要做的第二部分,但不是全部。我想删除像1到3和9到11。主要问题是从5到11行被删除。@M.Bugajski啊,我打错了。它确实删除了第1至3行和第9至11行