3

你能帮我在每次从字母数字更改为数字后拆分一个字符串(或者如果可能的话,最好在每个“拆分”场合放置一个空白),反之亦然?

所以一个像这样的字符串D2c1 22应该是这样的D 2 c 1 22。最好的方法是在从字母数字到数字的每次更改处留一个空白。

4

4 回答 4

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"
于 2012-11-09T06:14:30.200 回答
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'));
于 2012-11-09T06:35:22.403 回答
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 替换为 digit 和 digit 用 alpha 替换为第一个字符、空格和第二个字符。

于 2012-11-09T06:15:41.777 回答
1

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

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

并用空格替换它。

在 Perl 中查看

于 2012-11-09T06:17:14.580 回答