ユーザーが構成を編集するテキストエリアがあります。次のようにフォーマットされています。
foo = 'value'
bar = 2.1
john = false
値は、false、true、float、または文字列 (関数なし) にすることができます。次のようなものを作成するには、この文字列を正規表現する必要があります。
{
foo: 'value',
bar: 2.1,
john: false
}
このためのライブラリなどはありますか?
ユーザーが構成を編集するテキストエリアがあります。次のようにフォーマットされています。
foo = 'value'
bar = 2.1
john = false
値は、false、true、float、または文字列 (関数なし) にすることができます。次のようなものを作成するには、この文字列を正規表現する必要があります。
{
foo: 'value',
bar: 2.1,
john: false
}
このためのライブラリなどはありますか?
私はあなたのリクエストの良い出発点となるこの回答を取り、さまざまなデータ型を処理するためのルールをいくつか追加しました。おそらくこれが役立ちます:
var data ="foo = 'value'";
data +="\n" + "bar = 2.1";
data += "\n" + "john = false";
function JSONFY(data){
var regex = {
section: /^\s*\[\s*([^\]]*)\s*\]\s*$/,
param: /^\s*([\w\.\-\_]+)\s*=\s*(.*?)\s*$/,
comment: /^\s*;.*$/
};
var value = {};
var lines = data.split(/\r\n|\r|\n/);
var section = null;
function handleSection(sec) {
var isFloat = /^(?:[1-9]\d*|0)?(?:\.\d+)?$/;
if(sec.match(isFloat)) {
return parseFloat(sec);
} else if(sec=='true') {
return true;
} else if(sec=='false') {
return false;
}
return sec.replace(/^['"]/,'').replace(/['"]$/,'');
}
lines.forEach(function(line){
if(regex.comment.test(line)){
return;
}else if(regex.param.test(line)){
var match = line.match(regex.param);
if(section){
value[section][match[1]] = match[2];
}else{
value[match[1]] = handleSection(match[2]);
}
}else if(regex.section.test(line)){
var match = line.match(regex.section);
value[match[1]] = {};
section = match[1];
}else if(line.length == 0 && section){
section = null;
};
});
return value;
}
console.log(JSONFY(data));
これがテストするフィドルです。
入力データをどれだけ信頼できるかに応じて、次のようなコードを使用して単純な関数をいつでも作成できます (簡単にするために jQuery を使用します)。
var lines = $('textarea').val().split('\n');
var output = '{';
$(lines).each(function(l){
output += '\n\t' + lines[l].replace(/(\w+)\s=\s(.*)/, '$1: $2,');
});
output = output.substring(0, output.length - 1);
output += '\n}';
$('textarea').val(output);
ここでの主なポイントは、どれだけ厳密にしたいかによって、正規表現を微調整する必要があるということです (つまり、 の?
後に空白をオプションとして使用できるよう\s
にするか、値が特定の形式であることを確認します。