我有一个包含以下内容的文件.
<td> ${ dontReplaceMe } ReplaceMe ${dontReplaceMeEither} </td>
我想匹配’ReplaceMe’,如果它在td标签中,但是如果它在${…}表达式中则不匹配.
我可以用正则表达式做到这一点吗?
目前有:
sed '/\${.*?ReplaceMe.*?}/!s/ReplaceMe/REPLACED/g' data.txt
这不可能.
原文链接:https://www.f2er.com/regex/357293.html正则表达式可用于Type-3 Chomsky语言(常规语言).
但是,您的示例代码是Type-2 Chomsky语言(无上下文语言).
几乎只要涉及任何类型的嵌套(括号),您就会处理无上下文的语言,这些语言不包含在正则表达式中.
基本上没有办法在正则表达式中的一对x和y中定义,因为这需要正则表达式具有某种堆栈,而它不具有(在功能上等同于有限状态自动机).
被brandizzi挑战,找到一个可能与至少琐碎案件相匹配的正则表达式
我实际上想出了这个(痛苦的hacky)正则表达式模式:
perl -pe 's/(?<=<td>)((?:(?:\{.*?\})*[^{]*?)*)(ReplaceMe)(.*)(?=<\/td>)/$1REPLACED$3/g'
它适合(sic!)匹配这些情况:
<td> ${ dontReplaceMe } ReplaceMe ${dontReplaceMeEither} </td> <td> ReplaceMe ${dontReplaceMeEither} </td> <td> ${ dontReplaceMe } ReplaceMe </td> <td> ReplaceMe </td>
并且失败了这个(嵌套是Chomsky Type-2,还记得吗?;)):
<td>${ ${ dontReplaceMe } ReplaceMe ${dontReplaceMeEither} }</td>
它也不能代替多个匹配:
<td> ReplaceMe ReplaceMe </td> <td> ReplaceMe ${dontReplaceMeEither} ReplaceMe </td>
获得领先的$覆盖是棘手的部分.
这使得Reginald/Reggy在写这个野兽时不断崩溃.
再次:实验,不要在生产代码中使用它!
(…或者我会追捕你,如果我必须使用你的代码/ app;)