3

英数字から数字、またはその逆に変更するたびに、文字列を分割するのを手伝ってもらえますか (または、できれば「分割」のたびに空白を入れてください)。

したがって、文字列 likeD2c1 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は配列の配列を集約できないため、必要です。

あるいは、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'));
于 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つの正規表現を使用して、アルファを数字に、数字をアルファに置き換えて、最初の文字、スペース、および2番目の文字を使用することです。

于 2012-11-09T06:15:41.777 に答える
1

正規表現を使用して一致させることができます

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

スペースに置き換えます。

Perlで見る

于 2012-11-09T06:17:14.580 に答える