IT

RegExp에 대한 유형

itgroup 2023. 7. 27. 21:52
반응형

RegExp에 대한 유형

자바스크립트 객체가 정규식인지 감지할 수 있는 방법이 있습니까?

예를 들어, 다음과 같은 작업을 수행하고 싶습니다.

var t = /^foo(bar)?$/i;
alert(typeof t); //I want this to return "regexp"

이것이 가능합니까?

감사합니다!

편집: 모든 답변 감사합니다.제겐 두 가지 아주 좋은 선택이 있는 것 같습니다.

obj.constructor.name === "RegExp"

또는

obj instanceof RegExp

두 방법 모두에 대한 주요 장단점이 있습니까?

다시 한번 감사드립니다!

연산자의 인스턴스(instance)를 사용할 수 있습니다.

var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true

사실, 는 다음과 거의 같습니다.

var t = /^foo(bar)?$/i;
alert(t.constructor == RegExp);//returns true

RegExp기본 데이터 형식이 아니므로 사용할 수 없습니다.typeof이 질문에 대한 최선의 옵션이 될 수 있는 연산자.

그러나 위에서 또는 오리 유형 검사같은 다른 방법을 사용할 수 있습니다. 예를 들어, 이러한 개체에 중요한 메서드나 속성이 있는지 확인하거나 내부 클래스 값을 사용하여{}.toString.call(instaceOfMyObject)).

alert( Object.prototype.toString.call( t ) ); // [object RegExp]

이것은 객체 클래스를 가져오기 위한 사양에서 언급된 방법입니다.

ECMA스크립트 5 섹션 8.6.2 객체 내부 속성방법:

[Class] 내부 속성의 값은 모든 종류의 기본 제공 개체에 대해 이 사양에 의해 정의됩니다.호스트 개체의 [Class] 내부 속성 값은 "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp" 및 "String" 중 하나를 제외한 모든 문자열 값일 수 있습니다.[Class] 내부 속성의 값은 내부적으로 다른 종류의 개체를 구별하는 데 사용됩니다.이 사양은 Object.prototype.toString(15.2.4.2 참조)을 통해 프로그램이 해당 값에 액세스할 수 있는 수단을 제공하지 않습니다.

RegExp는 섹션 15.10 RegExp(정규식)의 사양에 정의된 객체 클래스입니다.개체:

RegExp 개체에는 정규식과 관련 플래그가 포함됩니다.

기브 더.constructor속성 회전:

> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true

언더스코어.js에서

// Is the given value a regular expression?
  _.isRegExp = function(obj) {
    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
  };

Google Chrome에서 작동:

x = /^foo(bar)?$/i;
x == RegExp(x); // true
y = "hello";
y == RegExp(y); // false

Regexp는 네이티브 Javascript 유형이 아닙니다.위의 대부분의 답변은 작업을 수행하는 방법을 알려주지만 이유는 알려주지 않습니다.이유는 이렇습니다.

이것을 확인할 수 있는 절대적인 방법은 없으며, 지금까지 가장 좋은 대답은

var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true

그러나 이 접근 방식에는 한 가지 단점이 있으며 정규식 개체가 다른 창에서 오는 경우 거짓으로 반환됩니다.

두 가지 방법이 있습니다.

/^\/.*\/$/.test(/hi/) /* test regexp literal via regexp literal */
/^\/.*\/$/.test(RegExp("hi") ) /* test RegExp constructor via regexp literal */
RegExp("^/" + ".*" + "/$").test(/hi/) /* test regexp literal via RegExp constructor */
RegExp("^/" + ".*" + "/$").test(RegExp("hi") ) /* test RegExp constructor via RegExp constructor */ 

delete RegExp("hi").source /* test via deletion of the source property */
delete /hi/.global /* test via deletion of the global property */
delete /hi/.ignoreCase /* test via deletion of the ignoreCase property */
delete RegExp("hi").multiline /* test via deletion of the multiline property */
delete RegExp("hi").lastIndex /* test via deletion of the lastIndex property */

문자열 리터럴이 regexp 백슬래시 구분 기호로 구분되면 regexp 자체 테스트가 실패합니다.

한다면Object.seal또는Object.freeze사용자 정의 개체에서 실행되며, 해당 개체도 앞서 언급한 모든 속성을 가집니다.delete문이 잘못된 긍정을 반환합니다.

레퍼런스

는 찾고있요어를 .typeof regex내가 그것을 사용하려고 했기 때문입니다.type definition함수의 TypeScript 특성에 사용할 수 있습니다.

그런 다음 다음 작업을 수행합니다.

const RegexType = /$/;

type paramProps = {
  regexParam: typeof RegexType;
}

여기서 테스트할 수 있습니다.

const RegexType = /$/;
const t = /^foo(bar)?$/i;

console.log(typeof t == typeof RegexType) //true

언급URL : https://stackoverflow.com/questions/4339288/typeof-for-regexp

반응형