Javascript에 RegExp.escape 함수가 있습니까?
가능한 문자열 중에서 정규 표현식을 만들고 싶습니다.
var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);
이를위한 내장 된 방법이 있습니까? 그렇지 않다면 사람들은 무엇을 사용합니까? 루비는 RegExp.escape
. 나는 내 자신을 쓸 필요가 없다고 느끼지 않습니다. 거기에 표준이 있어야합니다. 감사!
위에 링크 된 기능이 충분하지 않습니다. 문자 그룹에서 범위에 사용되는 ^
또는 $
(문자열의 시작과 끝) 또는 을 이스케이프하지 않습니다 -
.
이 기능을 사용하십시오 :
RegExp.escape= function(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
언뜻보기에는 불필요하게 보일 수 있지만 이스케이프 -
(및뿐만 아니라 ^
)는 문자를 이스케이프하는 데 적합한 기능을 문자 클래스와 정규 표현식 본문에 삽입하는 데 적합합니다.
이스케이프 /
는이 함수가 이후의 평가를 위해 JS 정규 표현식 리터럴에서 사용되는 이스케이프 문자에 적합하게 만듭니다.
둘 중 어느 하나를 피할 수있는 단점이 없으므로 더 넓은 사용 사례를 다루기 위해 탈출하는 것이 좋습니다.
그리고 이것이 표준 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
: 여유 공간 모드에서는 무시됩니다.,
: 분자 지정자에서 값을 구분합니다./
: 표현식을 시작하거나 종료합니다.:
: 특수 그룹 유형과 펄 스타일 문자 클래스의 일부를 완성합니다.!
: 폭이 0 인 그룹을 무효화합니다.<
/=
: 폭이 0 인 그룹 사양의 일부.
노트:
/
정규 표현의 풍미에 꼭 필요한 것은 아닙니다. 그러나 누군가 (shudder) 가 할 경우를 대비하여 보호합니다eval("/" + pattern + "/");
.,
문자열이 숫자 지정자에서 정수인 경우 자동 컴파일 오류 대신 RegExp 컴파일 오류가 올바르게 발생합니다.#
그리고\s
자바 스크립트에서 탈출 할 필요가 있지만, 많은 다른 맛을하지 않습니다. 정규식이 나중에 다른 프로그램으로 전달 될 경우에는 여기서 이스케이프됩니다.
JavaScript 정규식 엔진 기능에 추가 될 가능성에 대비하여 정규 표현식을 미래에 대비해야 할 경우 더 편집증을 사용하는 것이 좋습니다.
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
이 함수는 향후 정규 표현식 플레이버에서 구문에 사용되지 않도록 명시 적으로 보장 된 문자를 제외한 모든 문자를 이스케이프합니다.
진정으로 위생을 유지하려면 다음과 같은 경우를 고려하십시오.
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
이것은 해야 하지 다른 맛을 자바 스크립트에서 잘 컴파일,하지만 것입니다. 다른 플레이버로 전달하려는 경우 다음과 같이 null 경우를 s === ''
독립적으로 확인해야합니다.
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
정규식에 대한 Mozilla 개발자 네트워크 안내서 는 다음과 같은 이스케이프 기능을 제공합니다.
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
jQueryUI의 자동 완성 위젯 (버전 1.9.1)에서는 약간 다른 정규식 (6753 행)을 사용합니다. 다음은 @bobince 접근법과 결합 된 정규식입니다.
RegExp.escape = function( value ) {
return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
}
영숫자가 아닌 모든 문자를 빠져 나가는 것을 막을 수있는 것은 없습니다 :
usersString.replace(/(?=\W)/g, '\\');
수행 할 때 어느 정도의 가독성을 잃지 re.toString()
만, 단순성 (및 보안)이 크게 향상됩니다.
ECMA-262에 따르면, 한편으로, 정규 표현식 "구문 문자는"영숫자가 아닌 항상 결과가 안전하고, 이스케이프 시퀀스 (그런하다 \d
, \w
, \n
)는 항상 영숫자 같은 거짓 제어 이스케이프는 생성되지 않습니다 것을 .
에서 RegExp.escape에 대한 ES7 제안이 https://github.com/benjamingr/RexExp.escape/ 에서 사용할 수있는 polyfill로, https://github.com/ljharb/regexp.escape는 .
이것은 더 짧은 버전입니다.
RegExp.escape = function(s) {
return s.replace(/[$-\/?[-^{|}]/g, '\\$&');
}
이것은의 비 메타 문자를 포함 %
, &
, '
, 그리고 ,
있지만, 자바 스크립트 정규식 사양이 할 수 있습니다.
XRegExp에는 이스케이프 기능이 있습니다.
XRegExp.escape('Escaped? <.>'); // -> 'Escaped\?\ <\.>'
더 : http://xregexp.com/api/#escape
정규 표현식 (예 : 블랙리스트)에 문제를 일으킬 수있는 문자를 이스케이프 처리하는 대신 화이트리스트를 사용하는 것이 좋습니다. 이렇게하면 각 캐릭터가 일치하지 않는 한 오염 된 것으로 간주됩니다.
이 예제에서는 다음 표현식을 가정하십시오.
RegExp.escape('be || ! be');
문자, 숫자 및 공백을 허용합니다.
RegExp.escape = function (string) {
return string.replace(/([^\w\d\s])/gi, '\\$1');
}
보고:
"be \|\| \! be"
이스케이프 할 필요가없는 문자는 이스케이프 처리 할 수 있지만 표현을 방해하지는 않습니다 (약간의 약간의 벌칙이있을 수 있지만 안전을 위해 가치가 있습니다).
escapeRegExp = function(str) {
if (str == null) return '';
return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};
다른 답변의 함수는 전체 정규 표현식을 이스케이프 처리하는 데 과도합니다 ( 나중에 더 큰 정규 표현식으로 연결되는 정규 표현식의 일부 를 이스케이프 처리하는 데 유용 할 수 있음 ).
당신은 전체 정규 표현식을 탈출하거나 독립있는 메타 문자를 인용, 그것으로 완료 (경우 .
, ?
, +
, *
, ^
, $
, |
, \
무언가를) 또는 시작 ( (
, [
, {
) 당신이 필요로하는 모든 것입니다 :
String.prototype.regexEscape = function regexEscape() {
return this.replace(/[.?+*^$|({[\\]/g, '\\$&');
};
그리고 그렇습니다. JavaScript에는 이와 같은 기능이 내장되어 있지 않습니다.
또 다른 (훨씬 더 안전한) 접근 방식은 유니 코드 이스케이프 형식을 사용하여 모든 문자 (현재 우리가 아는 몇 가지 특수 문자가 아닌)를 이스케이프 처리하는 것입니다 \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');
리터럴로 간주 되기 위해 탈출해야 할 메타 문자는 12 개뿐입니다 .
균형 잡힌
정규식 래퍼에 삽입되고 추가 된 이스케이프 된 문자열로 수행 된 작업은 중요하지 않습니다.
이것을 사용하여 문자열을 바꾸십시오.
var escaped_string = oldstring.replace( /[\\^$.|?*+()[{]/g, '\\$&' );
참고 URL : https://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
'Programing' 카테고리의 다른 글
ASP.NET 웹 API를 보호하는 방법 (0) | 2020.02.25 |
---|---|
익명 클래스의 일반적인 목록 (0) | 2020.02.23 |
지시문을 정의 할 때 '컨트롤러', '링크'및 '컴파일'기능의 차이점 (0) | 2020.02.23 |
DrawerLayout을 사용하여 ActionBar / Toolbar 및 상태 표시 줄 아래에 표시하려면 어떻게합니까? (0) | 2020.02.23 |
@Mock과 @InjectMocks의 차이점 (0) | 2020.02.23 |