RegEx:拆分字符串字母数字/数字

时间:2012-11-09 06:07:23

标签: regex postgresql split

在从字母数字到数字的每次更改后,你可以帮我分割一个字符串(或者如果可能的话,首选在每个“分裂”场合放一个空白)吗?

因此像D2c1 22这样的字符串应该看起来像D 2 c 1 22。最好的方法是在从字母数字到数字的每次更改时留空。

4 个答案:

答案 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)

您可以使用正则表达式进行匹配

(?<=[a-z])(?=[0-9])|(?<=[0-9])(?=[a-z])

并用空格替换它。

See it in Perl