programing

JavaScript에 RegExp.escape 함수가 있나요?

randomtip 2022. 10. 23. 11:52
반응형

JavaScript에 RegExp.escape 함수가 있나요?

가능한 문자열 중에서 정규 표현을 만들고 싶을 뿐입니다.

var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);

그것에 대해 내장된 방법이 있나요?그렇지 않다면, 사람들은 무엇을 사용하나요?루비가 그랬어. 내가 직접 쓸 필요는 없을 것 같아. 뭔가 표준적인 게 있을 거야.

하다^ ★★★★★★★★★★★★★★★★★」$끝) 또는 ('스트링의 끝')-이치노

다음 기능을 사용합니다.

function escapeRegex(string) {
    return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}

보기에는 해 보일 수 , 합니다.-)^는 이스케이프 뿐만 아니라 는 이스케이프 문자를 정규식 본문뿐만 아니라 문자 클래스에 삽입하기에 적합한 기능을 제공합니다.

(에스케이프)/는 이스케이프 문자를 나중에 평가하기 위해 JavaScript regex 리터럴에서 사용하기 위한 함수를 만듭니다.

어느 쪽이든 도망쳐도 나쁠 것이 없기 때문에 폭넓은 사용 사례를 커버하기 위해 도망치는 것이 타당합니다.

그리고 이것이 표준 JavaScript의 일부가 아니라는 것은 실망스러운 실패입니다.

Lodash를 사용하는 모든 사용자는 v3.0.0에 _.escapeRegExp 함수가 내장되어 있으므로 다음과 같이 하십시오.

_.escapeRegExp('[lodash](https://lodash.com/)');
// → '\[lodash\]\(https:\/\/lodash\.com\/\)'

또한 Lodash 라이브러리 전체를 필요로 하지 않는 경우에는 해당 기능만 필요할 수 있습니다.

여기서 설명하는 대부분의 표현은 단일 특정 사용 사례를 해결합니다.

괜찮아요, 하지만 저는 '항상 일하는' 방식이 더 좋아요.

function regExpEscape(literal_string) {
    return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}

그러면 정규 표현에서 다음 중 하나의 리터럴 문자열이 "완전 이스케이프"됩니다.

  • 들어, ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」new RegExp(regExpEscape(str))
  • 들어, ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」new RegExp('[' + regExpEscape(str) + ']')
  • 들어, ★★★★★★★★★★★★★★★★」new RegExp('x{1,' + regExpEscape(str) + '}')
  • 비 JavaScript 정규 표현 엔진에서 실행.

대상 특수 문자:

  • -: 문자 클래스에 문자 범위를 만듭니다.
  • [] 문자 클래스를 시작/종료합니다.
  • {}: : : : : : : : : : : : : : : : : 。
  • () 합니다.: 을 사용하다
  • *+? 유형을 지정합니다 반복 유형을 지정합니다.
  • .: : : : : : : : : : : : : 。
  • \: 문자를 이스케이프하고 엔티티를 시작합니다.
  • ^ 영역의 일치 영역의 시작을 지정하고 문자 클래스의 일치를 비활성화합니다.
  • $: 영역의 일치하는 존의 끝을 지정합니다.
  • |: 체 : : : : : : : : : : 。
  • #: 빈 모드로 이치노
  • \s 이치노
  • ,: : : : : : : : : : : : : : 。
  • / 이치노
  • :: 특수 그룹 유형 및 Perl 스타일 문자 클래스의 일부를 완료합니다.
  • !폭 그룹을 부정합니다 폭 제로 그룹을 부정합니다.
  • <=폭 그룹 폭 제로 그룹 사양의 일부입니다.

주의:

  • /정규 표현의 어떤 맛에서도 반드시 필요한 것은 아닙니다.단, 다른 사람(shudder)이 다음과 같은 경우에 대비합니다.eval("/" + pattern + "/");.
  • ,는 문자열이 숫자 지정자의 정수인 경우 잘못된 컴파일이 아닌 RegExp 컴파일 오류가 올바르게 발생함을 보증합니다.
  • # , , , , 입니다.\sJavaScript에서는 이스케이프할 필요가 없지만 다른 많은 플레이버에서 실행할 수 있습니다.정규 표현이 나중에 다른 프로그램으로 전달될 경우에 대비하여 여기서 이스케이프됩니다.

또한 JavaScript regex 엔진 기능에 추가될 가능성에 대비하여 정규 표현을 미래에도 사용할 필요가 있는 경우에는 보다 편집적인 표현을 사용할 것을 권장합니다.

function regExpEscapeFuture(literal_string) {
    return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}

이 함수는 미래의 정규 표현 플레이버에서 구문에 사용되지 않도록 명시적으로 보장된 문자를 제외한 모든 문자를 이스케이프합니다.


진정한 위생 유지의 경우 다음 엣지 케이스를 고려하십시오.

var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');

이것은 JavaScript에서는 정상적으로 컴파일되지만 다른 플레이버에서는 컴파일되지 않습니다.다른 맛으로 넘어가려는 경우에는s === ''다음과 같이 개별적으로 확인해야 합니다.

var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');

Mozilla Developer Network's Guide to Regular Expressions에서는 다음 이스케이프 기능을 제공합니다.

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

jQuery UI의 자동 완성 위젯(버전 1.9.1)에서는 약간 다른 정규 표현식(6753행)을 사용합니다. 다음은 bobince의 접근 방식과 결합된 정규 표현식입니다.

RegExp.escape = function( value ) {
     return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
}

RegExp.escape에 대한 ES7 제안서는 https://github.com/benjamingr/RexExp.escape/,에서 구할 수 있습니다.

영숫자가 아닌 모든 문자를 그냥 빠져나가는 것을 막을 수는 없습니다.

usersString.replace(/(?=\W)/g, '\\');

하다 보면 .re.toString()심플함(및 보안)을 대폭 향상시킬 수 있습니다.

「 characters, 시퀀스 「EMA-262」)가 됩니다.「 syntax characters 」\d,\w,\n는 항상 하지 않습니다는 항상 영숫자이므로 잘못된 컨트롤 이스케이프가 발생하지 않습니다.

하나의 포맷을 하여 모든 있는 를입니다.\u{code}:

function escapeRegExp(text) {
    return Array.from(text)
           .map(char => `\\u{${char.charCodeAt(0).toString(16)}}`)
           .join('');
}

console.log(escapeRegExp('a.b')); // '\u{61}\u{2e}\u{62}'

은 꼭 .u하기 위한 : 플래그를 지정합니다.

var expression = new RegExp(escapeRegExp(usersString), 'u');

RegExp.escape에 대한 ES7 제안서는 https://github.com/benjamingr/RexExp.escape/,에서 구할 수 있습니다.

거부된 ES 제안에 기초한 예에는 TC39가 결정을 역추적하는 경우 속성이 이미 존재하는지 여부가 포함됩니다.


코드:

if (!Object.prototype.hasOwnProperty.call(RegExp, 'escape')) {
  RegExp.escape = function(string) {
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
    // https://github.com/benjamingr/RegExp.escape/issues/37
    return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
  };
}

코드 최소화:

Object.prototype.hasOwnProperty.call(RegExp,"escape")||(RegExp.escape=function(e){return e.replace(/[.*+\-?^${}()|[\]\\]/g,"\\$&")});

// ...
var assert = require('assert');
 
var str = 'hello. how are you?';
var regex = new RegExp(RegExp.escape(str), 'g');
assert.equal(String(regex), '/hello\. how are you\?/g');

요.npm모듈: https://www.npmjs.com/package/regexp.escape


이것을 인스톨 해, 다음과 같이 사용할 수 있습니다.


npm install regexp.escape

또는

yarn add regexp.escape

var escape = require('regexp.escape');
var assert = require('assert');
 
var str = 'hello. how are you?';
var regex = new RegExp(escape(str), 'g');
assert.equal(String(regex), '/hello\. how are you\?/g');

GitHub & NPM git///// shim / polyfill git git git git git 。는 논리를 으로 하고 있다.return RegExp.escape || implementation;regexp를 사용하다


NPM 모듈은 의존성이 높지만 외부 컨트리뷰터가 코드에 추가된 논리적인 부분을 쉽게 식별할 수 있도록 합니다.(ツ) \ (ツ) / /¯

이것은 단축판입니다.

RegExp.escape = function(s) {
    return s.replace(/[$-\/?[-^{|}]/g, '\\$&');
}

됩니다.%,&,' , , , , 입니다., JavaScript 에서는 이를 합니다.

XRegExp에는 이스케이프 기능이 있습니다.

XRegExp.escape('Escaped? <.>'); // -> 'Escaped\?\ <\.>'

상세내용 : http://xregexp.com/api/ #http://http://xregexp.com/api/

escapeRegExp = function(str) {
  if (str == null) return '';
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};

정규 표현(예: 블랙리스트)에서 문제를 일으킬 수 있는 문자만 이스케이프하지 말고 화이트리스트를 사용하는 것이 좋습니다.이렇게 하면 각 캐릭터가 일치하지 않는 한 오염된 것으로 간주됩니다.

이 예에서는 다음 식을 상정합니다.

RegExp.escape('be || ! be');

이 화이트리스트에는 문자, 숫자 및 공백이 있습니다.

RegExp.escape = function (string) {
    return string.replace(/([^\w\d\s])/gi, '\\$1');
}

반품:

"be \|\| \! be"

이것은 피할 필요가 없는 캐릭터에서 벗어날 수 있지만, 이것은 당신의 표현을 방해하지 않습니다(일부 사소한 시간 벌칙은 안전상 가치가 있습니다).

다른 응답의 함수는 정규 표현 전체를 이스케이프하기 위한 오버킬입니다(이러한 함수는 나중에 더 큰 정규 표현으로 연결될 정규 표현 일부를 이스케이프하는 데 유용할 수 있습니다).

regexp를 스탠드아론regexp」)의합니다..,?,+,*,^,$,|,\을 시작하세요( ).(,[,{만 됩니다

String.prototype.regexEscape = function regexEscape() {
  return this.replace(/[.?+*^$|({[\\]/g, '\\$&');
};

그리고 JavaScript에 이러한 기능이 내장되어 있지 않은 것은 실망스러운 일입니다.

리터럴로 간주하기 위해 이스케이프해야 하는 메타문자는 지금까지 12개뿐입니다.

이스케이프된 문자열, 균형 잡힌 regex 래퍼에 삽입되거나 추가된 문자열은 중요하지 않습니다.그건 중요하지 않아.

이것을 사용하여 문자열 치환을 수행합니다.

var escaped_string = oldstring.replace(/[\\^$.|?*+()[{]/g, '\\$&');

위의 bobince의 답변을 빌려서 태그가 달린 템플릿 함수를 만들었습니다.RegExp값의 일부는 이스케이프되고 일부는 이스케이프되지 않습니다.

regex-displays.displaces.displaces

RegExp.escape = text => text.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&');

RegExp.escaped = flags =>
  function (regexStrings, ...escaped) {
    const source = regexStrings
      .map((s, i) =>
        // escaped[i] will be undefined for the last value of s
        escaped[i] === undefined
          ? s
          : s + RegExp.escape(escaped[i].toString())
      )
      .join('');
    return new RegExp(source, flags);
  };
  
function capitalizeFirstUserInputCaseInsensitiveMatch(text, userInput) {
  const [, before, match, after ] =
    RegExp.escaped('i')`^((?:(?!${userInput}).)*)(${userInput})?(.*)$`.exec(text);

  return `${before}${match.toUpperCase()}${after}`;
}

const text = 'hello (world)';
const userInput = 'lo (wor';
console.log(capitalizeFirstUserInputCaseInsensitiveMatch(text, userInput));

TypeScript 팬 여러분...

global.d.ts

interface RegExpConstructor {
  /** Escapes a string so that it can be used as a literal within a `RegExp`. */
  escape(text: string): string;

  /**
   * Returns a tagged template function that creates `RegExp` with its template values escaped.
   *
   * This can be useful when using a `RegExp` to search with user input.
   *
   * @param flags The flags to apply to the `RegExp`.
   *
   * @example
   *
   * function capitalizeFirstUserInputCaseInsensitiveMatch(text: string, userInput: string) {
   *   const [, before, match, after ] =
   *     RegExp.escaped('i')`^((?:(?!${userInput}).)*)(${userInput})?(.*)$`.exec(text);
   *
   *   return `${before}${match.toUpperCase()}${after}`;
   * }
   */
  escaped(flags?: string): (regexStrings: TemplateStringsArray, ...escapedVals: Array<string | number>) => RegExp;
}

이것은 영구적인 해결책입니다.

function regExpEscapeFuture(literal_string) {
     return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}

언급URL : https://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript

반응형