development

자바 스크립트 정규식-대안을 보시겠습니까?

big-blog 2020. 6. 28. 17:41
반응형

자바 스크립트 정규식-대안을 보시겠습니까?


다음은 대부분의 정규식 구현에서 잘 작동하는 정규식입니다.

(?<!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

반응형