자바 스크립트 정규식-대안을 보시겠습니까?
다음은 대부분의 정규식 구현에서 잘 작동하는 정규식입니다.
(?<!filename)\.js$
filename.js를 제외하고 .js로 끝나는 문자열의 .js와 일치합니다.
자바 스크립트에는 정규 표현식이 없습니다. 누구나 동일한 결과를 얻고 자바 스크립트에서 작동하는 대체 정규식을 조합 할 수 있습니까?
다음은 몇 가지 생각이지만 도우미 기능이 필요합니다. 나는 정규식으로 그것을 달성하기를 바랐다 : http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
^(?!filename).+\.js
나를 위해 일한다
에 대해 테스트 :
- test.js 일치
- blabla.js 일치
- filename.js가 일치하지 않습니다
이 정규식에 대한 적절한 설명 은 단어가 포함되지 않은 문자열과 일치하는 정규식 에서 찾을 수 있습니까?
Javascript 버전 1.5 부터 사용 가능 하며 모든 주요 브라우저에서 지원됩니다.
filename.js가 아닌 filename2.js 및 2filename.js와 일치하도록 업데이트 되었습니다.
(^(?!filename\.js$).).+\.js
편집 : ECMAScript 2018부터 lookbehind 어설 션 (무제한)도 기본적으로 지원됩니다 .
이전 버전에서는 다음을 수행 할 수 있습니다.
^(?:(?!filename\.js$).)*\.js$
이것은 lookbehind 표현식이 내재적으로 수행하는 것을 명시 적으로 수행합니다. lookbehind 표현식과 정규 표현식이 일치하지 않는 경우 문자열의 각 문자를 확인한 다음 해당 문자 만 일치시킵니다.
^ # Start of string
(?: # Try to match the following:
(?! # First assert that we can't match the following:
filename\.js # filename.js
$ # and end-of-string
) # End of negative lookahead
. # Match any character
)* # Repeat as needed
\.js # Match .js
$ # End of string
또 다른 편집 :
이 목표를 달성하는 데 훨씬 쉬운 방법이 있다고 말하면 (특히이 답변이 너무 많이 찬성 되었기 때문에) 고통 스럽습니다. 모든 캐릭터에서 미리보기를 확인할 필요가 없습니다.
^(?!.*filename\.js$).*\.js$
마찬가지로 작동합니다.
^ # Start of string
(?! # Assert that we can't match the following:
.* # any string,
filename\.js # followed by filename.js
$ # and end-of-string
) # End of negative lookahead
.* # Match any string
\.js # Match .js
$ # End of string
int
앞에 오지 않는 모든 것을 찾으려고 가정 해 봅시다 unsigned
.
부정적인 표정을 지원합니다.
(?<!unsigned )int
부정적인 표정을 지원하지 않는 경우 :
((?!unsigned ).{9}|^.{0,8})int
기본적으로 아이디어는 n 개의 선행 문자를 잡고 부정적인 미리보기와 일치하는 것을 제외하고 n 개의 선행 문자가없는 경우와 일치시키는 것입니다. (여기서 n은 look-behind 길이입니다.)
따라서 문제의 정규 표현식 :
(?<!filename)\.js$
다음과 같이 번역됩니다 :
((?!filename).{8}|^.{0,7})\.js$
관심있는 문자열의 정확한 지점을 찾거나 특정 부분을 다른 것으로 바꾸지 않으려면 캡처 그룹을 가지고 놀아야 할 수도 있습니다.
앞뒤로 볼 수 있다면 먼저 문자열을 뒤집은 다음 미리 볼 수 있습니다. 물론 더 많은 작업을 수행해야합니다.
이것은 Tim Pietzcker의 답변 과 동등한 솔루션 입니다 (동일한 답변의 의견 참조).
^(?!.*filename\.js$).*\.js$
를 *.js
제외하고 일치하는 것을 의미 *filename.js
합니다.
To get to this solution, you can check which patterns the negative lookbehind excludes, and then exclude exactly these patterns with a negative lookahead.
Below is a positive lookbehind JavaScript alternative showing how to capture the last name of people with 'Michael' as their first name.
1) Given this text:
const exampleText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?";
get an array of last names of people named Michael. The result should be: ["Jordan","Johnson","Green","Wood"]
2) Solution:
function getMichaelLastName2(text) {
return text
.match(/(?:Michael )([A-Z][a-z]+)/g)
.map(person => person.slice(person.indexOf(' ')+1));
}
// or even
.map(person => person.slice(8)); // since we know the length of "Michael "
3) Check solution
console.log(JSON.stringify( getMichaelLastName(exampleText) ));
// ["Jordan","Johnson","Green","Wood"]
Demo here: http://codepen.io/PiotrBerebecki/pen/GjwRoo
You can also try it out by running the snippet below.
const inputText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?";
function getMichaelLastName(text) {
return text
.match(/(?:Michael )([A-Z][a-z]+)/g)
.map(person => person.slice(8));
}
console.log(JSON.stringify( getMichaelLastName(inputText) ));
참고URL : https://stackoverflow.com/questions/7376238/javascript-regex-look-behind-alternative
'development' 카테고리의 다른 글
500 내부 서버 오류가 발생하지 않고 PHP가 오류를 표시하도록하려면 어떻게해야합니까 (0) | 2020.06.28 |
---|---|
이벤트가 사람에 의해 트리거되는지 확인 (0) | 2020.06.28 |
Windows cmd 스크립트에서 여러 명령 실행 (0) | 2020.06.28 |
원격 SSH 세션에서 로컬 클립 보드로 데이터를 보내는 방법 (0) | 2020.06.28 |
테스트 리소스에 액세스하는 방법? (0) | 2020.06.28 |