当匹配单词

时间:2016-11-22 07:06:11

标签: regex notepad++ kml

我有一个类似的问题用于数字,这次我需要将它用于关键字。以下是我在KML文件中使用的示例数据。我想删除所有包含单词footway的地标。

 <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

3 个答案:

答案 0 :(得分:1)

这是一种方法:

  • 找到:int sumdiff(int* t, int size){ int sum=0; for (int i=0; i<=size;i++){ for(int j=i; j<=size;j++){ if(t[i]!=t[j]) sum=sum+t[i]; } } return sum; } int main() { int t[4]={3, 3, 1, 5}; cout << sumdiff(t, 4); }
  • 替换为:25

这将替换包含<Placemark>(?:(?!<Placemark).)*footway(?:.(?!<Placemark))*</Placemark>且仅包含NOTHING的所有<Placemark>块。

footway是否为lookahead,假设(?!<Placemark)之前没有<Placemark>,那么,当您有很多footway&#39时; s正则表达式一次匹配一个<Placemark>

<Placemark>是非捕获组,发生次数为0次或以上且不包含(?:(?!<Placemark).)*后跟一个字符。

答案 1 :(得分:0)

这对我来说是Notepad ++ 6.9.2。它也适用于这个在线python正则表达式测试器:http://codeforces.com/blog/entry/43499

您确定自己设置了正确的选项(regular expression + . matches newline)吗?

编辑:嗯,在您编辑之后,这是一个不同的故事!不知道如何使用正则表达式实现它。我认为解析XML然后去除包含单词footway的节点会更容易。

了解原因:https://regex101.com/r/BYGvzo/1

答案 2 :(得分:0)

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

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

需要阻止匹配中包含第一个</Placemark>

如果这是一次性或很少需要的过程,那么我有时使用的方法,因为它具有很强的适应性,如下所示。查找文件中未出现的单个字符。对于此示例,使用=。使用(</?p)(lacemark>)替换所有正则表达式\1=\2。通向文本:

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

然后使用正则表达式<P=lacemark>[^=]*footway[^=]*</P=lacemark>替换所有内容。最后,使用另一个替换全部删除所有=个字符。

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