我有一堆XML,其行如下所示
<_char font_name="/ITC Stone Serif Std Bold" italic="true" />
但有时看起来像这样
<_char font_size="88175" italic="true" font_name="/ITC Stone Serif Std Bold" />
这就是我需要做的事情
这可以用一个正则表达式完成吗?
我不是在寻找实时解决方案。我只有大量的XML文件,其中存在“错误”,我正在尝试使用PowerGrep进行全局搜索和替换,这需要单个正则表达式。如果编写脚本是唯一的方法,那就这样吧。
答案 0 :(得分:3)
简单使用'|'操作员满足你?
name="/ITC Stone Sans Std Bold"[^>]italic="(true)"|italic="(true)"[^>]font_name="/ITC Stone Serif Std Bold"
这应该检测具有属性名称之前的任何行,在属性为italic之后,值为true。
答案 1 :(得分:1)
通常,使用RE进行XML解析并不是一个好主意。但如果你真的想要,最简单的方法就是两行:
if (/ITC Stone Serif Std Bold/) {
s/italic="true"/italic="false"/g;
}
答案 2 :(得分:0)
在Perl中 - 未经测试:
while (<>)
{
s/italic="true"/italic="false"/ if m%font_name="/ITC Stone Sans Std Bold" italic="true"|italic="true" font_name="/ITC Stone Serif Std Bold"%;
print;
}
非常简单 - 可能需要全局限定符,如果同一行的其他部分可能包含斜体选项,则可能需要更复杂的替代。
另外 - 一个想法 - 你是否应该借此机会使符号统一,所以总是把斜体放在字体名称的前面(或后面)?
答案 3 :(得分:0)
Pattern: /(<_char(?=(?:\s+\w+="[^"]*")*?\s+font_name="[^"]*?ITC Stone Serif Std Bold[^"]*")(?:\s+\w+="[^"]*")*?\s+italic=")true(?=")/
Replacement: '$1false'
答案 4 :(得分:0)
使用Perl 5.10的新功能。
s(
<_char \s* [^>]*? \K (?: (?&font) \s+ (?&italic) | (?&italic) \s+ (?&font) )
(?(DEFINE)
(?<font>font_name="/ITC[ ]Stone[ ]Serif[ ]Std[ ]Bold")
(?<italic>italic="true")
)
){
$+{font} . 'italic="false"'
}xge
警告:未经过测试。