我需要从 XML 文件中清除 120,000 个动态 URL。如何编写正则表达式来查找“?” 一行中的字符,然后删除该行(或用空格替换它)
需要删除的行示例:
<url>http://www.website.com/order/index.asp?type=something%20something&DisplayName=N&Material=blah</url>
您的正则表达式将只是:
<url>.*?\?.*?<\/url>
如果你想用 C# 替换它,那么:
String sourcestring = "BlahBlahBlah\n<url>http://www.website.com/order/index.asp?type=something%20something&DisplayName=N&Material=blah</url>\nBlah?BlahB?lah\nBlahBla?hBlah\n<url>http://www.website.com/order/index.asp?type=something%20somethi\nng&DisplayName=N&Material=blah</url>\nBlahBlahBlah";
String matchpattern = @"<url>.*?\?.*?<\/url>";
String replacementpattern = @"";
Console.WriteLine(Regex.Replace(sourcestring,matchpattern,replacementpattern,RegexOptions.Multiline | RegexOptions.Singleline));
请注意,这会将 url 标记替换为空格,即使它们像示例文本中所示那样进入下一行。
替换前的示例文本:
替换后的结果文本:
等等等等等等
哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇
等等等等等等
更新:
如果您使用的是 Notepad++,则需要在“查找/替换”对话框中选中匹配换行符复选框(以便匹配溢出的 url 标记行,因为.
在正则表达式中不匹配 CR/LF。
另一种方法是使用 Ωmega 的正则表达式,因为它匹配除其类中的字符之外的所有内容:<url>[^<?]*\?[^<]*<\/url>
一个简单gsub
的红宝石就可以了。例如用问号代替空格:
string_containing_urls = "<url>http://example.com?sdfhkldj</url>\n<url>http://example.com</url>"
string_containing_urls.gsub(/\?/, ' ') # => "<url>http://example.com sdfhkldj</url>\n<url>http://example.com</url>"
如果您想<url> ... </url>
用空格替换标签之间的任何 url,您可以使用以下内容:
string_containing_urls = "<url>http://example.com?sdfhkldj</url>\n<url>http://example.com</url>"
string_containing_urls.gsub(/<url>.*\?.*<\/url>/, ' ') # => " \n<url>http://example.com</url>"
以下将删除整行
string_containing_urls = "<url>http://example.com?sdfhkldj</url>\n<url>http://example.com</url>"
string_containing_urls.gsub(/<url>.*\?.*<\/url>\n/, '') # => "<url>http://example.com</url>"
类似的替换功能也可以在大多数其他语言中使用。
替换<url>[^<?]*\?[^<]*<\/url>
为空字符串
就像是
(<url>http://[^?<]+)(\?[^<]*)(</url>)
应该管用。如果您只想摆脱动态部分,请返回 1 美元 3 美元。如果要删除整行,请执行
(<url>http://[^?<]+\?[^<]*</url>)
并用空字符串替换。如果您以每行为基础运行它,那么如果没有“?”,它就不会匹配任何东西。
假设您的文件名为input.txt
包含:
<urls>
<url>http://www.google.com/search?type=something%20something&DisplayName=N&Material=blah</url>
<url>http://www.yahoo.com/finance</url>
<url>http://www.stackoverflow.com/questions?type=somestuff</url>
<url>http://www.facebook.com/person?type=someotherstuff</url>
<url>http://www.amazon.com/order/index.asp</url>
</urls>
使用sed命令:
sed '/<url>.*\?.*<\/url>/d' input.txt >> output.txt
然后输出将是:
<urls>
<url>http://www.yahoo.com/finance/</url>
<url>http://www.amazon.com/order/index.asp</url>
</urls>