SPL 中使用正则替换的问题
我有这么一个需求,把文本中的数值用正则匹配出来后替换成该数值的 2 倍,比如,
文本串 AB12CD34,把其中的数值用 regex@a 替换成其两倍,结果是 AB24CD68。
可不可以用正则来实现。我在操作时发现如下问题:
用 regex@a 替换时, 有其正则构造属性,$1,$2, 但不能对其进行转换运算,只能文本拼接。比如,
=A1.regex@a (“(\d+)”,(a=“$1”,b=fill(a,2),b))
此时,"$1" 是匹配到的数值文本 12 和 34,fill 之后变成 1212 和 3434, 这是正确的,如下图:
但是,换成另一种写法,对 $1 进行数值转换,number(“$1”) 这个结果是 null, 如下图:
=A1.regex@a (“(\d+)”,(a=“$1”,b=number(a),string(b==null)))
再换一种写法,对 $1,取左边第一位,left(“$1”,1),照理文本操作应该没问题,但是报错了,如下图:
=A1.regex@a (“(\d+)”,(a=“$1”,b=left(a,1),b))
请问:
1、有没有办法用正则实现这个需求?
2、spl 的 regex 中除了 $1,$2…$9 这个属性,还有没有其它属性, 比如,
匹配到的字符串本身: “$&”;
匹配时的源字符串: “$_”;
匹配到的字符串的左右两边的字符串: “$`”,“$’”;
有没有匹配时的索引:regexp.index
Thx in advance!
相当专业..
我知道出错的问题在哪里了,把 "$1" 这种当成一个文本串来处理了,所以:
1、left(“$1”,1)=“$”,导致报错,分组索引缺失;
2、number(“$1”) 里边这个不是数值字符串,所以返回 null,这个也说通了;
3、fill(“$1”,2)=“$1$1”,这个属于歪打正着,regex 能识别这个属性,所以出结果了。
但是,还是没有想出正则替换的解决办法,或许正则无解。
这个问题用正则表达式无法解决,可以用 words 函数把文本拆成字母串和数字串序列,然后再进行运算。
=A1.words@w().(parse()).(if(ifnumber(),*2,)).concat()
大概可以写成这样,比较啰嗦。
是不是可以支持第 2 个参数是表达式,而匹配的所有组当成序列,这样可以用 ~ 和#
谢谢大佬指点!集算器里 workaround 肯定有。
我是想模拟 JS 里的 replace 方法:
“AB12CD34”.replace(/\d+/g,x=>x*2)
第二个参数这样写是可以的,但其他的正则属性没有试出来。
比如交换位置: