你能帮我在每次从字母数字更改为数字后拆分一个字符串(或者如果可能的话,最好在每个“拆分”场合放置一个空白),反之亦然?
所以一个像这样的字符串D2c1 22
应该是这样的D 2 c 1 22
。最好的方法是在从字母数字到数字的每次更改处留一个空白。
你能帮我在每次从字母数字更改为数字后拆分一个字符串(或者如果可能的话,最好在每个“拆分”场合放置一个空白),反之亦然?
所以一个像这样的字符串D2c1 22
应该是这样的D 2 c 1 22
。最好的方法是在从字母数字到数字的每次更改处留一个空白。
您可以使用此正则表达式来查找它切换的位置:
(?<=\d)(?=\D)|(?<=\D)(?=\d)
这边走:
"234kjh23ljkgh34klj2345klj".gsub(/(?<=\d)(?=\D)|(?<=\D)(?=\d)/, " ")
=> "234 kjh 23 ljkgh 34 klj 2345 klj"
编辑:没有零长度向前看,向后看:
"234kjh23ljkgh34klj2345klj".gsub(/(\d)(\D)/, "#{$1} #{$2}").gsub(/(\D)(\d)/, "#{$2} #{$1}")
=> "23 jk 5 jkgk 5 lk 534 lj"
这是一种使用 PostgreSQL 测试并验证可以工作的方法。这有点折磨,所以表演可能......很有趣。
CREATE AGGREGATE array_cat_agg (
BASETYPE = anyarray,
SFUNC = array_cat,
STYPE = anyarray
);
SELECT array_to_string(array_cat_agg(a), ' ')
FROM regexp_matches('234kjh23ljkgh34klj2345klj', '(\D*)(\d*)', 'g') x(a);
我们需要array_cat_agg
因为常规array_agg
不能聚合数组的数组。
或者,@davidrac 的一种方法可以与 PostgreSQL 一起使用,并且可能表现得更好(尽管我还没有测试过):
SELECT regexp_replace(
regexp_replace(
'234kjh23ljkgh34klj2345klj', '(\d)(\D)', '\1 \2', 'g'
), '(\D)(\d)', '\1 \2', 'g');
这是在两遍中执行替换。首先,它在一系列数字结束和一系列非数字开始的地方插入一个空格。然后在另一遍中,它在非数字系列结束和数字系列开始的地方插入空格。
更新:这是一个改进的公式:
SELECT trim(regexp_replace('234kjh23ljkgh34klj2345klj', '(?!\d)(\D+)|(?!\D)(\d+)', '\1\2 ', 'g'));
最好的方法是在从字母数字到数字的每次更改处留一个空白。
不难做到:
$ echo "D2c1 22" | sed 's|\([a-ZA-Z]\)\([0-9]\)|\1 \2|g;s|\([0-9]\)\([a-ZA-Z]\)|\1 \2|g'
D 2 c 1 22
在这里我使用sed
了它的正则表达式,因为你没有提到你使用哪种语言。主要思想是使用 2 正则表达式,它将 alpha 替换为 digit 和 digit 用 alpha 替换为第一个字符、空格和第二个字符。