正则表达式 - 嵌套模式 - 在外部模式中但排除内部模式

Ste*_*eve 1 regex bash grep sed pattern-matching

我有一个包含以下内容的文件.

<td> ${ dontReplaceMe } ReplaceMe ${dontReplaceMeEither} </td>
Run Code Online (Sandbox Code Playgroud)

我想匹配'ReplaceMe',如果它在td标签中,但是如果它在$ {...}表达式中则不匹配.

我可以用正则表达式做到这一点吗?

目前有:

sed '/\${.*?ReplaceMe.*?}/!s/ReplaceMe/REPLACED/g' data.txt
Run Code Online (Sandbox Code Playgroud)

Reg*_*ent 9

这是不可能的.

正则表达式可用于Type-3 Chomsky语言(常规语言).
但是,您的示例代码是Type-2 Chomsky语言(无上下文语言).

几乎只要涉及任何类型的嵌套(括号),您就会处理无上下文语言,这些语言不包括在正则表达式中.

目前基本上没有办法定义within a pair of x and y 在正则表达式,因为这将需要正则表达式有某种栈,它不会(在功能上等同于一个有限状态自动机).


由brandizzi挑战找到一个可能与至少琐碎案例相匹配的正则表达式
我实际上想出了这个(痛苦的hacky)正则表达式模式:

perl -pe 's/(?<=<td>)((?:(?:\{.*?\})*[^{]*?)*)(ReplaceMe)(.*)(?=<\/td>)/$1REPLACED$3/g'
Run Code Online (Sandbox Code Playgroud)

适合 (sic!) 匹配这些情况:

<td> ${ dontReplaceMe } ReplaceMe ${dontReplaceMeEither} </td>
<td> ReplaceMe ${dontReplaceMeEither} </td>
<td> ${ dontReplaceMe } ReplaceMe </td>
<td> ReplaceMe </td>
Run Code Online (Sandbox Code Playgroud)

并且失败了这个 (嵌套是Chomsky Type-2,还记得吗?;)):

<td>${ ${ dontReplaceMe } ReplaceMe ${dontReplaceMeEither} }</td>
Run Code Online (Sandbox Code Playgroud)

也不能代替多个匹配:

<td> ReplaceMe ReplaceMe </td>
<td> ReplaceMe ${dontReplaceMeEither} ReplaceMe </td>
Run Code Online (Sandbox Code Playgroud)

获得领先优势$是棘手的部分.
这让Reginald/Reggy在写这个野兽时不断崩溃.

再次:实验,不要在生产代码中使用它!

(...或者我会追捕你,我是否必须使用你的代码/ app;)