RegExp의 시리얼화
그래서 저는 그게 궁금했어요.JSON.stringify
RegExp를 빈 객체 리터럴(fiddle)로 줄입니다.
JSON.stringify(/^[0-9]+$/) // "{}"
이 동작은 예기된 것입니까?RegExp는 시리얼화할 속성이 없는 오브젝트입니다.즉, 날짜도 객체입니다.JSON.stringify()
는 의미 있는 문자열을 생성할 수 있습니다.
JSON.stringify(new Date) // "2014-07-03T13:42:47.905Z"
JSON이 RegExp에 동일한 고려사항을 제공하기를 희망합니다.RegExp.prototype.toString()
.
만약 누군가가 관심을 보인다면, 좋은 해결 방법이 있습니다.나는 현재의 행동이 옳다고 생각하지 않는다.예를들면,Date
인스턴스는 다음과 같이 빈 개체로 직렬화되지 않습니다.RegExp
단,object
JSON 표현도 없습니다.
RegExp.prototype.toJSON = RegExp.prototype.toString;
// sample
var foo = { rgx: /qux$/ig, date: new Date }
JSON.stringify(foo);
//> {"rgx":"/qux$/gi","date":"2014-03-21T23:11:33.749Z"}"
JSON.stringify와 JSON.parse는 모두 커스터마이즈하여 커스텀시리얼라이제이션과 디시리얼라이제를 실행할 수 있습니다.replacer
인수를 리바이버합니다.
var o = {
foo: "bar",
re: /foo/gi
};
function replacer(key, value) {
if (value instanceof RegExp)
return ("__REGEXP " + value.toString());
else
return value;
}
function reviver(key, value) {
if (value.toString().indexOf("__REGEXP ") == 0) {
var m = value.split("__REGEXP ")[1].match(/\/(.*)\/(.*)?/);
return new RegExp(m[1], m[2] || "");
} else
return value;
}
console.log(JSON.parse(JSON.stringify(o, replacer, 2), reviver));
당신만의 연재 포맷을 생각해내면 됩니다.
예, JSON에는 RegExp 개체에 대한 표준 표현이 없기 때문입니다.그래서 그냥 빈 물건이에요.
편집 - 지금은 2018년입니다.답변은 다음과 같은 방법을 제안하고 있습니다..toJSON()
시제품에 이 방법을 추가하고 싶지만, 기타는 괜찮을 것 같습니다.
Object.defineProperty(RegExp.prototype, "toJSON", {
value: RegExp.prototype.toString
});
기타 등등.그러면 함수 이름이 열거되지 않으므로 원숭이 패치가 다소 위생적입니다.
이 문제를 해결한 방법은 다음과 같습니다.
문자열로 직렬화:
var pattern = /foobar/i;
var serialized = JSON.stringify(pattern.toString());
그런 다음 다른 regex를 사용하여 수분을 보충합니다.
var fragments = serialized.match(/\/(.*?)\/([a-z]*)?$/i);
var rehydrated = new RegExp(fragments[1], fragments[2] || '');
패턴과 깃발을 보존합니다.누군가 도움이 되길 바랍니다!
RegExp.prototype.toJSON = RegExp.prototype.toString;
var regexp = /^[0-9]+$/;
var foo = { rgx: regexp.source, date: new Date };
var stringified = JSON.stringify(foo);
new RegExp(JSON.parse(stringified).rgx)
좋은 접근법은 다음과 같습니다.
function stringifyFilter(key,value) {
if (value instanceof RegExp) {
return value.toString();
}
return value;
}
var myObj = {
text : 'Howdy ho!',
pattern : /[a-z]+/i
}
JSON.stringify(myObj,stringifyFilter); // output: {"text":"Howdy ho!","pattern":"/[a-z]+/i"}
언급URL : https://stackoverflow.com/questions/12075927/serialization-of-regexp
'programing' 카테고리의 다른 글
$scope vs AngularJS (0) | 2023.02.11 |
---|---|
작곡가 "경로" 리포지토리가 작동하도록 가져올 수 없습니다. (0) | 2023.02.11 |
이동 시 JSON Post Request 처리 (0) | 2023.02.11 |
Oracle 테이블에서 중복된 값을 찾으려면 어떻게 해야 합니까? (0) | 2023.02.11 |
데이터가 도착하기 전에 ng-src가 이미지를 로드하지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.02.11 |