正则表达式 – 嵌套模式 – 在外部模式中但排除内部模式
发布时间:2020-12-14 06:31:53 所属栏目:百科 来源:网络整理
导读:我有一个包含以下内容的文件. td ${ dontReplaceMe } ReplaceMe ${dontReplaceMeEither} /td 我想匹配’ReplaceMe’,如果它在td标签中,但是如果它在${…}表达式中则不匹配. 我可以用正则表达式做到这一点吗? 目前有: sed '/${.*?ReplaceMe.*?}/!s/Replace
我有一个包含以下内容的文件.
<td> ${ dontReplaceMe } ReplaceMe ${dontReplaceMeEither} </td> 我想匹配’ReplaceMe’,如果它在td标签中,但是如果它在${…}表达式中则不匹配. 我可以用正则表达式做到这一点吗? 目前有: sed '/${.*?ReplaceMe.*?}/!s/ReplaceMe/REPLACED/g' data.txt
这不可能.
正则表达式可用于Type-3 Chomsky语言(常规语言). 几乎只要涉及任何类型的嵌套(括号),您就会处理无上下文的语言,这些语言不包含在正则表达式中. 基本上没有办法在正则表达式中的一对x和y中定义,因为这需要正则表达式具有某种堆栈,而它不具有(在功能上等同于有限状态自动机). 被brandizzi挑战,找到一个可能与至少琐碎案件相匹配的正则表达式 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> 获得领先的$覆盖是棘手的部分. 再次:实验,不要在生产代码中使用它! (…或者我会追捕你,如果我必须使用你的代码/ app;) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |