エンコードされたテキストの巨大な文字列(22000文字以上)があります。コードは数字[0-9]と小文字[az]で構成されています。4文字ごとにスペースを挿入する正規表現と、40文字ごとに改行[\n]を挿入する正規表現が必要です。何か案は?
2 に答える
多くの人はforループと文字列の連結でこれを行うことを好みますが、私はそれらのsubstring
呼び出しを嫌います。正規表現が仕事に適したツールではない場合(HTMLの解析)、正規表現を使用することには本当に反対ですが、この場合は非常に簡単に操作できると思います。
あなたが文字列を持っているとしましょう
var str = "aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnoooo";
また、4文字ごとにスペースを挿入し、40文字後に改行を挿入する場合は、次のコードを使用できます。
str.replace(/.{4}g/, function (value, index){
return value + (index % 40 == 36? '\n' : ' ');
});
newline(40)インデックスがspace index(4)の倍数でない場合、これは機能しないことに注意してください。
私はこれをプロジェクトで抽象化しました。これを行う簡単な方法は次のとおりです。
/**
* Adds padding and newlines into a string without whitespace
* @param {str} str The str to be modified (any whitespace will be stripped)
* @param {int} spaceEvery number of characters before inserting a space
* @param {int} wrapeEvery number of spaces before using a newline instead
* return {string} The replaced string
*/
function addPadding(str, spaceEvery, wrapEvery) {
var regex = new RegExp(".{"+spaceEvery+"}", "g");
// Add space every {spaceEvery} chars, newline after {wrapEvery} spaces
return str.replace(/[\n\s]/g, '').replace(regex, function(value, index) {
// The index is the group that just finished
var newlineIndex = spaceEvery * (wrapEvery - 1);
return value + ((index % (spaceEvery * wrapEvery) === newlineIndex) ? '\n' : ' ');
});
}
正規表現自体はスペースを挿入しないので、使用している言語に関係なく、正規表現の検索に基づいて挿入するコマンドがあると想定します。
したがって、4文字を見つけて40文字を見つける:これは一般的な正規表現ではきれいではありません(特定の実装に数値を表現するための優れた方法がない限り)。4文字を検索するには、
....
通常の正規表現ファインダーは最大のムンクを使用するため、1つの正規表現の最後から前方に検索して再度最大のムンクを行うと、文字列が4文字にチャンクされます。醜い部分は、標準の正規表現では、を使用する必要があるということです
........................................
40文字のチャンクを見つけるには、最初に4文字を実行する場合は、実行する必要があることに注意してください。
..................................................
また
.... .... .... .... .... .... .... .... .... ....
あなたがすでに入れたスペースを説明するために。
ピリオドは任意の文字を検出しますが、[0-9 | az]のみを使用しているため、他に何も挿入されないようにする必要がある場合は、各ピリオドの代わりにその正規表現を使用できます。キモい。
お気づきかもしれませんが、正規表現にはいくつかの制限があります。チョムスキー階層を見て、理論上の限界を実際に調べてください。