英数字から数字、またはその逆に変更するたびに、文字列を分割するのを手伝ってもらえますか (または、できれば「分割」のたびに空白を入れてください)。
したがって、文字列 likeD2c1 22
はのようになりますD 2 c 1 22
。最善の方法は、英数字から数字に変わるたびに空白を入れることです。
英数字から数字、またはその逆に変更するたびに、文字列を分割するのを手伝ってもらえますか (または、できれば「分割」のたびに空白を入れてください)。
したがって、文字列 likeD2c1 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
は配列の配列を集約できないため、必要です。
あるいは、PostgreSQLで動作し、おそらくパフォーマンスが大幅に向上する@davidracのアプローチの形式は次のとおりです(テストしていませんが)。
SELECT regexp_replace(
regexp_replace(
'234kjh23ljkgh34klj2345klj', '(\d)(\D)', '\1 \2', 'g'
), '(\D)(\d)', '\1 \2', 'g');
これは、2 つのパスで置換を実行しています。まず、一連の数字が終わり、一連の非数字が始まる場所にスペースを挿入します。次に、別のパスで、一連の非数字が終わり、一連の数字が始まる場所にスペースを挿入します。
更新:これは改良された処方です:
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つの正規表現を使用して、アルファを数字に、数字をアルファに置き換えて、最初の文字、スペース、および2番目の文字を使用することです。