2016-11-22 59 views
0

我有一个类似的问题,这次用于数字,我需要将它用于关键字。以下是我从KML文件中使用的示例数据。我想删除包含单词footway的所有地标。记事本++ RegEx在单词匹配时在标签之间移除

<Placemark> 
     <styleUrl>#nothing</styleUrl> 
     <ExtendedData> 
      <SchemaData> 
       <SimpleData>highway</SimpleData> 
      </SchemaData> 
     </ExtendedData> 
     <LineString> 
      <coordinates>0.0000,0.0000,0</coordinates> 
     </LineString> 
    </Placemark>  
    <Placemark> 
     <styleUrl>#nothing</styleUrl> 
     <ExtendedData> 
      <SchemaData> 
       <SimpleData>footway</SimpleData> 
      </SchemaData> 
     </ExtendedData> 
     <LineString> 
      <coordinates>0.0000,0.0000,0</coordinates> 
     </LineString> 
    </Placemark> 

我试着用以下但它是捕捉一切

(?i)<Placemark>.*?footway.*?</Placemark> 

下面是我的记事本+ +设置

Find what: (?i)<Placemark>.*?footway.*?</Placemark> 
Replace with: 
Warp around 
Search Mode: Regular expression & mathces newline 
+0

你想删除完整的'Placemark'标签,对吧?似乎与我的记事本++。你正在使用哪个版本? – lazlev

+0

是的,我想删除标签。我正在使用verison 6.9.1。我无法升级超出此版本 – JeremyA1

回答

1

这里有很长的路要走:

  • 查找内容:<Placemark>(?:(?!<Placemark).)*footway(?:.(?!<Placemark))*</Placemark>
  • 替换为:NOTHING

这将替换包含所有<Placemark>footway只有他们。

(?!<Placemark)是负lookahead,它假定是footway之前没有<Placemark>,所以,当你有很多<Placemark>的正则表达式一个<Placemark>在时间相匹配。

(?:(?!<Placemark).)*是非捕获组中,发生0次或更多次,并且不包含(?!<Placemark)后跟一个字符。

+0

@ JeremyA1:不客气,查看我的编辑 – Toto

0

这是为我工作用记事本++ 6.9.2。它也可以在这个网上蟒蛇正则表达式测试仪:https://regex101.com/r/BYGvzo/1

你确定你有(regular expression + . matches newline)设置正确的选项?

编辑:好吧,编辑后,这是一个不同的故事!不知道如何用正则表达式来实现它。我认为解析XML然后摆脱包含单词footway的节点会更容易。

了解为什么:RegEx match open tags except XHTML self-contained tags

+0

我看到的问题是,它匹配所有内容,直到它到达人行道。 https://regex101.com/r/BYGvzo/2 – JeremyA1

0

简化您的文件,它看起来像下面的第一行和正则表达式匹配是按照第二行

<Placemark> ... </Placemark> <Placemark> ...footway ... </Placemark> 
<Placemark> .*?       footway .*? </Placemark> 

需要防止第一</Placemark>被列入比赛。

如果这是一次性的或很少需要的过程,那么我有时使用的方法,因为它是非常适应性的如下。找到文件中任何地方都不会出现的单个字符。对于这个例子,使用=。用\1=\2替换所有正则表达式(</?p)(lacemark>)。以领先的文字:

<P=lacemark> ... </P=lacemark> <P=lacemark> ...footway ... </P=lacemark> 

然后做一个替换,所有的正则表达式<P=lacemark>[^=]*footway[^=]*</P=lacemark>什么也没有。最后,用另一个replace-all删除所有=字符。

如果没有易于使用的单个字符(即某些东西而不是=),则在上述步骤之前进行一些替换以创建未使用的字符。例如首先将所有&替换为&amp;,然后将所有=替换为&eq;。现在=可免费使用。完成上述步骤后,撤消替换,首先将所有&eq;替换为=,然后将所有&amp;替换为&

相关问题