0

javascript splitメソッドを使用して、文字列をサブ文字列の配列に分割できます。例:

var timeformat="HH:MM:SS";
var timeformatarray=timeformat.split(":");

セパレータが一定でない場合に文字列を分割する簡単な方法はありますか?実際、私は次のような任意の形式で提供される可能性のあるタイムフォーマットを分割する必要があります。

var timeformat="HH hr : MM min : SS sec";
var timeformat="HHhour:MMminute:SSsecond";
var timeformat="HHh MMm SSs";

定数はHH、MM、SSのみです。Timeformatは、ユーザーが表示する時刻の形式を指定するためのオプションです。「HH」、「MM」、「SS」は定数テキスト(数字ではありません)であり、これら3つは変更されない固定定数です。変更できるのは、上記の例に示すように、timeformat文字列のサフィックスとセパレータだけです。

作業できるように、timeformat文字列を配列に分割するメソッドが必要です。結果が欲しい:

timeformat[0] = "HH"
timeformat[1] = " hr : " <- with spaces (if any)
timeformat[2] = "MM"
timeformat[3] = " min : "
timeformat[4] = "SS"
timeformat[5] = " sec"

この配列を使用して、時刻をフォーマットし、それぞれの接尾辞と区切り文字を追加します。正規表現を使用して各文字をループするさまざまな方法を試しましたが、効率的でまっすぐではありませんでした。よろしくお願いします。

解決策: 正規表現、分割、配列を使用してformatstringで機能するメソッドを作成することで、問題を解決できました。私はもっ​​と良い解決策があると確信していますが、私はそれを得ることができなかったので、ここに問題の私の解決策があります。Stephen C正規表現の方向性に感謝します。

function GetTimeFormatArray(timeformatstring){
        var timesuffixes = timeformatstring.split(/HH|MM|SS/);
        timesuffixes= $.grep(timesuffixes,function(n){
            return(n);
        });

        var pattern = timesuffixes.join('|');
        var timeprefixes = timeformatstring.split(new RegExp(pattern));
        timeprefixes = $.grep(timeprefixes,function(n){
            return(n);
        });

        var timeFormatArray = [];
        for(var i = 0; i < timesuffixes.length; i++){
            timeFormatArray.push(timeprefixes[i]);
            timeFormatArray.push(timesuffixes[i]);
        }
        return timeFormatArray;
    }
4

3 に答える 3

1

この関数split()は、区切り文字として正規表現をとることができます。これがサンプルですが、私は正規表現の専門家ではないため、これは最適化されていない可能性があります。

var test = 'HH hr : MM min : SS sec';

//split by ":" or space with optional leading and trailing space
console.log(test.split(/\s?[\s:]\s?/));​
//["HH", "hr", "MM", "min", "SS", "sec"]
于 2012-05-22T00:05:30.300 に答える
1

Java でこれを行っていた場合は、look-aheads と look-behindsから区切り記号の正規表現を作成します。残念ながら、Javascript 正規表現は後読みをサポートしていません。

私はあなたがこれを難しい方法で行う必要があると思います。文字列を次のようなものに一致させます

    /(.*)HH(.*)MM(.*)SS(.*)/

次に、マッチャーから返された配列にインデックスを付けます。HH/ MM/SSが任意の順序で表示される場合など、次のようなより複雑な正規表現が必要になる場合があります。

    /(.*?)(?:(HH|MM|SS)(.*?))*/

これは非イーガー マッチングと非キャプチャ グループを使用しています。"HHMMSS" (つまり、"区切り記号" の間にスペースがない) や "SS one SS" (同じ "区切り記号" の複数のインスタンス) などのケースに対処する必要があります。また、慎重に作成された入力が大量のバックトラッキングを引き起こす可能性があるため、この種のパターンはかなり危険であることに注意してください。

于 2012-05-22T13:19:24.663 に答える
0
var rx = /^(\d{2})(.*?)(\d{2})(.*?)(\d{2})(.*?)$/
var timeformat = [
    "11 hr : 22 min : 33 sec",
    "11hour:22minute:33second",
    "11h 22m 33s"
];

for (var i = 0; i < timeformat.length; i++) {
    console.log(timeformat[i])
    try {
        for (var j = 0; j < timeformat[i].match(rx).length; j++) {
            console.log('\tmatch['+j+'] = ',timeformat[i].match(rx)[j]);
        }
    } catch(e) {}
}
于 2012-05-22T00:21:54.303 に答える