问题 正则表达式 - 将一个字符的序列替换为另一个字符的相同数字


假设我有一个这样的字符串:

=====

我想用这个替换它:

-----

我只想更换它,如果它有超过一定数量的那个角色(我们会说> 3)。

所以,这些应该是替代品:

=== -> ===
==== -> ----
===== -> -----

该应用程序是我想用markdown替换markdown中的所有1级标题,而不更改嵌入的代码块。

我知道我可以这样做:

/=/-/g,但这匹配任何等号(if (x == y)),这是不可取的。

或这个:

/===+/----/g,但这并不考虑原始匹配字符串的长度。

这可能吗?


9639
2017-09-07 17:26


起源

你使用的是哪种语言 - justintime
我故意把它排除在外。我使用vim或sed来做正则表达式,但我想要一个可以应用于任何语言的通用解决方案。 - beatgammit
在纯RE中,我不认为有一种通用的方法可以做你想要的。如下所述,各种实现都添加了允许它的功能,但没有任何东西能够支持RE的所有内容。 - zigdon
所以我一直没有回答:-)。标签说明因此,在提问时,请始终包含特定的编程语言或工具。 - justintime
javascript的同样问题: stackoverflow.com/questions/7456559/... - blahdiblah


答案:


Perl有可能:

my $string = "===== Hello World ====";
$string =~ s/(====+)/"-" x length($1)/eg;
# $string contains ----- Hello World ----

Flag / e使Perl在s ///的第二部分执行表达式。 您可以尝试使用oneliner:

perl -e '$ARGV[0] =~ s/(====+)/"-" x length($1)/eg; print $ARGV[0]' "===== Hello World ===="

9
2017-09-07 17:37



我喜欢这个命令行版本。我仍然喜欢更通用的东西,但这解决了这个问题。 - beatgammit
@tjameson,我不确定你的意思是“更一般”,但你也可能喜欢缩写版的正则表达式: s/(={3,})/"-" x length($1)/eg 哪里 ={4,} 表示4个或更多字符 - yko
我的意思不是perl。可以在大多数正则表达式平台(sed,vim等)上运行的东西。无论如何,问题解决了,谢谢。 - beatgammit


取决于您使用的语言。基本上,在某些语言中,您可以将代码放在正则表达式的右侧,允许您执行以下操作:(这是在perl中):

s/(=+)/(length($1) > 3 ? "-" : "=") x length($1)/e

'e'标志告诉perl执行表达式右侧的代码,而不是仅仅将其解析为字符串。


4
2017-09-07 17:36



我没有使用语言。我只是使用sed或vim的正则表达式。没有语言可以吗? - beatgammit
很确定vim的语言足以让你做类似的事情 - 请参阅 \= replace命令中的operator。 - zigdon
@tjameson:你 是 使用“一种语言”,无论你使用什么。此外,我看不出任何人可能会使用的可能原因 sed -e 's/foo/bar/g' 什么时候 perl -pe 's/foo/bar/g' 工作得更好。 “试试吧,你会的 喜欢 它!” - tchrist
@ tchrist-技术上,正则表达式识别一种语言。某些功能在正则表达式的实现中很常见。这是我试图访问的子集。它与实现无关,而是与普遍接受的“标准”功能相关联。我想在sed,vim,perl,c ++,javascript,python等的提升中使用相同的东西,除非可能有一点语法,否则不会发生太大变化。话虽如此,我知道这个答案有其优点,但它是Perl特有的,这不是我要求的。如果我找不到更通用的解决方案,我会接受这个。 - beatgammit
如果您试图坚持使用ALL正则表达式实现的公共子集,那么您将受到相当的限制。分组是()或()等 - justintime