2013-02-21 2 views
0

사용자가 문자열을 제공하고 미리 정의 된 문자열 목록을 통해 해당 문자열을 검색하려고합니다. 트릭은 사용자의 문자열이 무엇이든 할 수 있고 작동하지 않습니다 [*.?^등 그래서 뭔가 임의의 (사용자 제공) 문자열과 일치하는 정규 표현식

"first half of my regex" + `USER_STRING` + "second half of my regex" 

처럼 같은 정규식 문자를 포함 할 수 있다는 것이다. 확실한 해결 방법은 USER_STRING의 모든 특수 문자를 이스케이프 처리 된 대응 문자로 이스케이프 처리하는 것이지만 더 좋은 방법이 될 수 있습니다.

추신 : 문자열의 왼쪽과 오른쪽에 패턴을 일치시켜야하기 때문에 간단한 문자열 검색이 수행되지 않습니다.

+0

더 좋은 방법은 정규식 문자를 사용자 문자열로 만드는 것 외에 다른 것이 있습니까? –

+0

두 부분으로 나누어 주시겠습니까? 먼저 정규 표현식을 찾은 다음 일치하는 문자열을 검색합니다. – freejosh

+1

@TimPietzcker : 왜 그 대답이'-'를 벗어나는 지 모르겠습니다. '[]'가 이스케이프되었을 때 그렇게 할 필요는 없습니다. – nhahtdh

답변

0

JavaScript에는 정규 표현식 이스케이프 기능이 내장되어 있지 않습니다 (예 : PHP의 preg_quote과 유사). 그러나 어떤 사람들은 동등한 것을 만들기 위해 그것을 스스로 취했습니다 : https://stackoverflow.com/a/6829401/454533

아니, 더 좋은 방법은 없습니다.

0

그냥 모든 특수 문자를 인용 정규식 리터럴 문자로 처리되어 있는지 확인하기 위해이 기능을 사용

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

기능은 입력 및 모든 특수 문자와 문자열 탈출 출력으로 문자열을 기대합니다. 이것은 원래 문자열과 일치하는 정규 표현식을 만들기 위해 RegExp 생성자에 공급할 수있는 String을 생성하기위한 것입니다. 이 메서드의 출력을 안전하게 연결할 수 있는지 여부에 대해서는 아래의 추가 참고 사항을 확인하십시오.

MDN의 all special characters in JS regex 목록. 많은

  • 것도 이러한 ^, $, ., |, *, ?, +에 대해 할 말이 없습니다.
    ^ 첫 번째 문자의 경우 [], ()의 경우 첫 번째 문자가 ? 인 특수 문자를 사용하지 않도록 설정합니다.
    ?에 대해서도 동일하며 한정 기호 뒤에 따라갈 때 느린 일치 동작이 발생합니다. 하지만 더 이상 []가 탈출 할 때 -

  • -[] 내부에만 의미가 있습니다.
    템플릿 문자열이 "[" + input + "]" 인 경우 일 수 있습니다. 여기에 문자 클래스 안에 \Q\E의 동작을 모방하지 않지만 원하는 경우 위 함수에서 -을 정규식에 추가 할 수 있습니다.

  • \ 다음에 특수 시퀀스가있는 경우 \이 이스케이프 될 때 그 의미가 없어집니다.
    관련 메모에서 위의 방법이 실패하는 경우는 템플릿 문자열이 "\\" + input 일 때입니다. 그러나 나는 이라고 말하고 싶습니다. 템플릿 문자열을 작성한 사람은 모두 잘못 되었기 때문에입니다.

  • :, =, !는 (비 캡처 그룹과 예견을) () 내부에서만 의미하고 ? 후에 수행해야하지만 ()가 탈출하는 경우도 그 의미를 잃었다. ?은 이미 이스케이프 처리되어 있으므로 이스케이프 된 문자열을 () 사이에 삽입해도 아무런 문제가 없습니다.
    템플릿 문자열이 "(?" + input + ")" 인 경우 위의 방법을 벗어나지 않으면 오류가 발생합니다. 나는 주사를 허용하는 사람이기 때문에 이것을 쓰는 사람은 누구나 다시 비난합니다.

  • ,{} 내부에서만 의미가 있지만, {}가 탈출 할 때 그 의미를 잃었다. 템플릿 문자열이있을 때
    이스케이프가 실패 사례는 "\\w+ = {" + input + "}" (예를 들어,이 초기화 일치하는),하지만 의도는 그들에게 리터럴 문자와 일치하는 경우 일반적으로, 하나는 템플릿 문자열에 {}을 탈출합니다.
    반복의 경우도 있지만 템플릿 문자열은 ".{" + start + "," + end + "}이어야하며 입력은 먼저 소독해야합니다.

요약하면 이스케이프 기능이 작동하려면 템플릿 문자열의 메타 문자가 올바르게 이스케이프 처리되어야합니다. 이스케이프 된 문자열을 문자 클래스에서 사용하려면 -을 문자 클래스에 추가합니다.

관련 문제