如果字符串以另一个单词 regex perl 开头,则忽略该字符串

问题描述 投票:0回答:1

我正在阅读一个 XML 文件,其中我正在替换某些单词。我不想替换 XML 元素或属性中的单词。我使用消极的向后看和向前看,我做到了 90%。但是,如果一个值出现在包含我想要替换的字符串的属性中,那么它就会被替换。我不想那样。

我的正则表达式:

-$fi=~s/(?<!<|\/)(?<!value=")\bis\b(?!=)/iss/g

此正则表达式与元素属性和值属性不匹配。但是,如果有像

value="hello there"
这样的文本,并且我用某个单词替换
there
,那么它就会被替换。我想要一个正则表达式,如果在
there
开头没有出现单词
value="
,它将进行搜索。

regex xml perl
1个回答
0
投票

执行此操作的正确工具是 XML 解析器。

如果您可以接受快速而肮脏的黑客攻击,并且会仔细检查结果以确保没有破坏某些内容,那么使用正则表达式修改元素内容的一种方法是在

>
<
。例如,要将 There 的第一个实例(不区分大小写)转换为全部大写:

$_ = '<p1 value="Hello there">foo bar There baz</p1>';
if (s/(>[^<]*) \b(there)\b ([^<]*<\/)/$1 . uc($2) . $3/iex) {
  print;
}
else {
  print "No match.\n";
}

替代寻找

  • >
    ,它假定是开放标记分隔符
  • 零个或多个非
    <
    字符 - 与前一个字符一样,左侧的所有内容
  • there
    两侧都有字边界断言
    \b
  • 零个或多个非
    <
    字符,后跟
    </
    — 与前一个一样,所有内容都位于右侧

然后它重新组装结果,除了 tHeRe,但它以大写形式出现。

在线尝试以查看

的输出
<p1 value="Hello there">foo bar THERE baz</p1>

替换末尾的开关表示

  • /i
    — 不区分大小写
  • /e
    — 执行替换并将其结果插入字符串
  • /x
    — 扩展语法,在本例中,在
    \b(there)\b
    周围添加空格,将其与模式的其余部分分开,以提高可读性

警告: 正则表达式缺乏足够的能力来全面处理 XML。如果您的 XML 很简单,上面的代码可能会起作用。如果没有,它可能会错过替换,或者更糟糕的是进行替换,从而破坏您的文档。仔细检查结果。

© www.soinside.com 2019 - 2024. All rights reserved.