帮助正则表达式在其他东西之前或之后匹配某些东西

时间:2008-10-13 14:26:07

标签: regex

我有一堆XML,其行如下所示

<_char font_name="/ITC Stone Serif Std Bold" italic="true" />

但有时看起来像这样

<_char font_size="88175" italic="true" font_name="/ITC Stone Serif Std Bold" />

这就是我需要做的事情

  • 对于包含 ITC Stone Serif Std Bold 的每一行,将 italic =“true”替换为 italic =“false ,无论是否在斜体部分之前或之后出现。

这可以用一个正则表达式完成吗?

我不是在寻找实时解决方案。我只有大量的XML文件,其中存在“错误”,我正在尝试使用PowerGrep进行全局搜索和替换,这需要单个正则表达式。如果编写脚本是唯一的方法,那就这样吧。

5 个答案:

答案 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

使用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

警告:未经过测试。