你能帮助我拆分一个字符串(或在可能的情况下,每次从字母数字到数字或数字到字母数字的变化时放置一个空格)吗?
因此,像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"
regress=> select regexp_replace( '234kjh23ljkgh34klj2345klj', '(?<=\d)(?=\D)|(?<=\D)(?=\d)', ' ', 'g');
出现了 ERROR: invalid regular expression: quantifier operand invalid
错误。请参见 http://sqlfiddle.com/#!12/d41d8/148。 - Craig RingerCREATE 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
无法聚合数组中的数组。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'));
standard_conforming_strings
更改之前?尝试 SET standard_conforming_strings = on;
然后再次测试。(这就是为什么你在问题中总是提到你的PostgreSQL版本)。如果使用 standard_conforming_strings
可以正常工作,则(a)升级PostgreSQL并(b)参见http://www.postgresql.org/docs/current/static/runtime-config-compatible.html#GUC-STANDARD-CONFORMING-STRINGS,了解如何使查询在不升级PostgreSQL的情况下正常工作。基本上,不要使用 '\'
,而是使用 E'\\'
;双反斜杠并使用 E''
。 - Craig Ringer'(\d)(\D)'
变成 E'(\\d)(\\D)'
等等。顺便说一下,您需要紧急开始计划升级您已经到了生命周期末期且已经过时的PostgreSQL,并且在问题中始终提及您的版本,尤其是因为它非常过时。另请参阅 http://www.postgresql.org/support/versioning/。 - Craig Ringer$ 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
和它的正则表达式,因为您没有提到使用哪种语言。主要思路是使用两个正则表达式,将字母替换为数字,数字替换为字母,并应用于第一个字符、空格和第二个字符。
\d
和\D
,这样您就可以处理任何数字和非数字序列,而不仅仅是小写字母数字。 - Craig Ringer