在从字母数字到数字的每次更改后,你可以帮我分割一个字符串(或者如果可能的话,首选在每个“分裂”场合放一个空白)吗?
因此像D2c1 22
这样的字符串应该看起来像D 2 c 1 22
。最好的方法是在从字母数字到数字的每次更改时留空。
答案 0 :(得分:3)
您可以使用此正则表达式查找切换位置:
(?<=\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"
答案 1 :(得分:2)
这是一种使用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'));
答案 2 :(得分:1)
最好的方法是在从字母数字到数字的每次更改时留空。
不难做到:
$ 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替换为数字和数字,将alpha替换为第一个字符,空格和第二个字符。
答案 3 :(得分:1)