[英]Regex search and replace where the replacement is a mod of the search term
我很难找到解决方案,我很确定正则表达式支持它。 我只是想不起来正则表达式世界中这个概念的名字。
我需要搜索并替换特定模式的字符串,但模式可能不同,并且替换需要“记住”它正在替换的内容。
例如,假设我有一个任意字符串:134kshflskj9809hkj
我想用括号将数字括起来,所以结果是:(134)kshflskj(9809)hkj
查找数字很简单,但是如何包围它们呢?
任何人都可以提供样本或指出我正确的方向吗?
在一些不同的语言中:
// C#:
string result = Regex.Replace(input, @"(\d+)", "($1)");
// JavaScript:
thestring.replace(/(\d+)/g, '($1)');
// Perl:
s/(\d+)/($1)/g;
// PHP:
$result = preg_replace("/(\d+)/", '($1)', $input);
(\\d+)
周围的括号使它成为一个“组”,特别是第一个(并且仅在这种情况下)可以在替换字符串中反向引用的组。 在某些实现中需要g
标志以使其在单个字符串中多次匹配)。 替换字符串非常相似,尽管有些语言会使用\\1
而不是$1
,有些语言会同时使用。
大多数正则表达式替换函数允许您在定义替换字符串时引用正则表达式中指定的捕获组(又名反向引用)。 例如,使用 PHP 中的preg_replace()
:
$var = "134kshflskj9809hkj";
$result = preg_replace('/(\d+)/', '(\1)', $var);
// $result now equals "(134)kshflskj(9809)hkj"
其中\\1
表示“正则表达式中的第一个捕获组”。
另一个有点通用的解决方案是:
搜索: /([\\d]+)([^\\d]*)/g
替换: ($1)$2
([\\d]+)
:匹配一组一个或多个数字并将它们保留在一个组中
([^\\d]*)
:匹配一组非数字,并保留它们。 \\D
也可以在这里工作。
g
:表示这是一个全局表达式,对输入进行多次处理。
($1)
: 在替换块中,括号没有特殊含义,所以输出第一组,用括号包围它。
$2
: 输出第二组
我使用了一个非常好的在线正则表达式工具来测试我的表达式。 下一步是将其应用于您正在使用的语言,因为每个语言都有自己的实现细微差别。
如果您只是想搜索数字并替换为由括号包围的找到的正则表达式,则不需要反向引用(分组)。 在替换字符串中使用整个正则表达式匹配更简单。
例如对于 perl
$text =~ s/\d+/($&)/g;
这将搜索 1 个或多个数字并替换为匹配项周围的括号(由$&指定),尾随g以查找和替换所有匹配项。
有关正则表达式语言的正确语法,请参阅http://www.regular-expressions.info/refreplace.html 。
根据您的语言,您希望匹配组。
所以通常你会以这样的形式制作一个图案
([0-9]{1,})|([a-zA-Z]{1,})
然后,您将迭代(特定于您的语言)中的结果组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.