JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】ハイフン区切りの文字列を負の数や数値の範囲に対応させて分割する方法

課題:ハイフン区切りの文字列に負の数や数値の範囲が含まれる場合

ハイフン(-)で区切られた文字列を扱うとき、単純に split("-") を使うだけでは不十分なケースがあります。文字列の中に負の数(-120 など)や数値の範囲(90-100 など)が含まれている場合です。

次のようなデータを例に考えてみましょう。

var firstValue = "John-Smith-90-100-US";
var secondValue = "David-Miller--120-AUS";

firstValue には範囲を表す「90-100」が、secondValue には負の数「-120」が含まれています。これらをひとつの要素として保持したまま文字列を分割したい場合は、正規表現を活用するのが効果的です。

解決策:正規表現で分割位置を判定する

以下のコードでは、先読み(lookahead)を利用した正規表現によって、「分割すべきハイフン」と「値の一部であるハイフン」を自動的に見分けています。

var firstValue = "John-Smith-90-100-US";
var secondValue = "David-Miller--120-AUS";
var regularExpression = /-(?=[A-Za-z-]|\d+-\d)/;
var result1 = firstValue.split(regularExpression);
var result2 = secondValue.split(regularExpression);
console.log(result1);
console.log(result2);

正規表現の仕組み

/-(?=[A-Za-z-]|\d+-\d)/ のポイントは、ハイフンの直後の文字列を先読みして判定している点です。

  • [A-Za-z-] … ハイフンの直後に英字または別のハイフンが続く場合にマッチします。「John-Smith」のような名前の区切りや、「--120」のように負の数の直前にあるハイフンが該当します。
  • \d+-\d … ハイフンの直後に「数字-数字」という並びが続く場合にマッチします。これにより「Smith-90-100-US」では範囲「90-100」の直前だけで分割され、範囲内部のハイフンは無視されます。

つまり、負の数を表すマイナス記号や範囲をつなぐハイフンは分割対象から除外されるため、数値を壊さずに正確に分割できます。

実行方法

上記のコードをファイル(ここでは demo241.js)に保存し、Node.js で実行します。

node demo241.js

実行結果

実行すると、コンソールには次のように出力されます。

PS C:\Users\Amit\javascript-code> node demo241.js
[ 'John', 'Smith', '90-100', 'US' ]
[ 'David', 'Miller', '-120', 'AUS' ]

名前や国コードは個別の要素に分割されながらも、「90-100」という範囲と「-120」という負の数は、それぞれひとつの要素としてそのまま保持されていることが確認できます。

まとめ

ハイフン区切りの文字列に負の数や数値の範囲が含まれる場合は、split("-") の代わりに先読みを使った正規表現で分割するのが有効です。/-(?=[A-Za-z-]|\d+-\d)/ のようなパターンを活用すれば、区切り文字としてのハイフンと、数値の一部としてのハイフンを自動的に判別でき、意図どおりの分割結果を得られます。

  1. JavaScriptで指定範囲内の特定の距離を持つk-素数ペアを見つける方法

    k-素数(K-Prime)とは自然数のうち、素因数を重複込みで数えてちょうどk個持つものを「k-素数(k-prime)」と呼びます。たとえば4の場合、素因数は2だけですが、4 = 2 × 2 と分解できるため、2が2回カウントされます。このことから4は2-素数であるといえます。同様に、8 = 2 × 2 × 2 と3つの素因数に分解できるため、8は3-素数ということになります。問題の概要今回は、次の3つの引数を受け取るJavaScript関数を実装します。k:素因数の個数(重複込み)step:求めるペア間の距離(間隔)range:探索対象となる範囲[開始値, 終了値]この関数は、指定された範囲

  2. JavaScriptで数値と文字数が一致する文字列を検証する方法

    問題文字列 str を引数として受け取るJavaScript関数を作成することを考えます。この関数は、文字列内の英字部分を、その直前にある数字に基づいて検証する必要があります。具体的には、文字列を数字で分割し、各数字とそれに続く部分文字列の文字数を比較します。すべての組み合わせが一致していれば、その文字列は有効であるとして true を返し、一箇所でも不一致があれば false を返します。例えば、以下のような文字列を見てみましょう。5hello4from2meこの文字列に対しては、true を返す必要があります。なぜなら、数字で分割すると「hello」「from」「me」という3つの部分文字