【发布时间】:2009-12-11 17:55:42
【问题描述】:
背景
考虑以下输入:
<Foo
Bar="bar"
Baz="1"
Bax="bax"
>
处理后,我需要它如下所示:
<Foo
Bar="bar"
Baz="1"
Bax="bax"
CustomAttribute="TRUE"
>
实施
这是所有我需要为不超过 5 个文件做的事情,所以使用正则表达式以外的任何东西似乎都过大了。无论如何,我想出了以下(Perl)正则表达式来完成这个:
$data =~ s/(<\s*Foo)(.*?)>/$1$2 CustomAttribute="TRUE">/sig;
问题
这很好用,但是有一个明显的问题。这种模式是“愚蠢的”,因为如果 CustomAttribute 已经被添加,上面概述的操作只会盲目地追加另一个 CustomAttribute=...。
当然,一个简单的解决方案是编写一个辅助表达式,在运行替换操作之前尝试匹配CustomAttribute。
问题
由于我对脚本语言和正则表达式领域相当陌生,我想知道是否可以在不引入任何宿主语言结构(即 Perl 中的 if 语句)的情况下解决这个问题,并且只需使用比我上面写的更“智能”的版本?
【问题讨论】:
-
omg 另一个 HTML + 正则表达式注释,HTML 不是常规语言,请使用解析器
-
如果只有五个文件,请手动更改。
-
造成问题的不是您对语言的不熟悉,而是您不理解这种“愚蠢”的解决方案解决了您提出的唯一问题。当您提供一个简单的示例并且不解释转换背后的原理 时,您将获得“解决”简单示例但可能无法“解决”一般应用程序的解决方案。所以你真的希望你的所有标签都有一个
CustomAttribute="TRUE"属性吗? -
@Ether:五个文件并不意味着他只有五个替换。也许每个文件都有 1,000,000 条记录 :)
-
不要使用正则表达式,因为你认为你的问题很小。当它们是可以为您提供正确答案的工具时,请使用它们。