trim 원형 함수

일반적인 경우 정규 표기 법 은/[Ctrl+A 전체 선택:외부 Js 를 도입 하려 면 페이지 를 새로 고침 해 야 실행 할 수 있 습 니 다.]빅 데이터 의 길 어 지 는 문자열 을 만나면 자원 이 많이 소모 되 는 것 을 발견 할 수 있 습 니 다.효율 이 높 지 않 아 참 을 수 없 을 때 도 있 습 니 다.<meta http-equiv="Pragma" content="no-cache"/> <meta http-equiv="Cache-Control" content="no-cache"/> <meta http-equiv="Expires" content="0"/><meta http-equiv="ImageToolbar" content="no"/><style type="text/css" title="default" media="screen">/*<![CDATA[*/*]>*/</style><textarea>여기에 빈 칸 이나 tab 문 자 를 충분히 쓰 십시오.<script type="text/javascript">//<![CDATA[String.prototype.trim = function () {return this.replace(/^[\s\t ]+|[\s\t ]+$/g, '');}var s = document.getElementsByTagName('textarea')[0].valuevar d = new Date();s.trim();alert(new Date()-d);//]]></script>[Ctrl+A 전체 선택:<a href="https://www.jb51.net/article/23421.htm" title="查看具体详情" rel="noreferrer noopener nofollow">引入外部Js需再刷新一下页面才能执行</a>]이 이 유 를 설명 할 때 예전 에 master regular expression 에서 언급 한 것 을 생각 합 니 다.NFA 와 DFA 의 엔진 은 차이 가 있다.js/perl/php/java/.net 은 모두 NFA 엔진 입 니 다.한편,DFA 는 NFA 체제 와 달리 5 가지 영향 을 미친다.1.DFA 는 텍스트 문자열 의 모든 문 자 를 한 번 만 스 캔 하면 빠 르 지만 특성 이 비교적 적다.NFA 는 문 자 를 뒤 집어 먹고 문 자 를 뱉 어야 하 며 속도 가 느 리 지만 특성 이 풍부 하기 때문에 오히려 광범 위 하 게 응용 되 고 있다.현재 의 주요 정규 표현 식 엔진,예 를 들 어 Perl,Ruby,Python 의 re 모듈,자바 와.NET 의 regex 라 이브 러 리 는 모두 NFA 의 것 이다.2.NFA 만 lazy 와 backreference(후 참조)등 기능 을 지원 합 니 다.3.NFA 는 급 하 게 공 을 세 워 상 을 청 하기 때문에 가장 왼쪽 정규 식 이 우선 매 칭 에 성공 하기 때문에 가끔 최 적 매 칭 결 과 를 놓 칠 수 있 습 니 다.DFA 는'가장 긴 왼쪽 정규 식 우선 매 칭 성공'이다.4.NFA 결 성 은 greedy 양사(즉,/.*/,/\w+/와 같은'중복 n'회 모드 로 탐욕 적 으로 진행 되 며,가능 한 한 많은 문 자 를 일치 시 켜 그만 둘 수 없 을 때 까지)를 사용 합 니 다.NFA 는 양사 에 우선 매 칭 됩 니 다.5.NFA 는 재 귀적 호출 의 함정 에 빠 져 성능 이 매우 떨 어 질 수 있다.backtracking(회 삭)NFA 가 자신 이 많이 먹었다 는 것 을 알 게 되면 하나씩 토 하고 토 하면 서 일치 하 는 과정 을 찾 는 것 을 backtracking 이 라 고 합 니 다.이 과정 이 존재 하기 때문에 NFA 매 칭 과정 에서 특히 불합리한 정규 매 칭 을 작성 하 는 과정 에서 텍스트 가 반복 적 으로 스 캔 되 어 효율 적 인 손실 이 적지 않 습 니 다.이 이 치 를 이해 하 는 것 은 효율 적 인 정규 표현 식 을 쓰 는 데 도움 이 된다.포 지 셔 닝/분석 원인 은 위의 trim 원형 방법 을 설명 할 때.테스트 를 통 해 결과 가 정확 한 지 는 말 하지 않 고 JS NFA 엔진 의 회 삭 횟수 를 풀 수 있 는 몇 가지 방법 이 있 습 니 다.한 정 된 양 어 를 없 애 는 것,즉<pre><code><code><br/>String.prototype.trim = function () { <br/>return this.replace(/^[\s\t ]+|[\s\t ]$/g, ''); <br/>}<br/></code></code></pre>b.문자열 의 끝 이 일치 하 는 것 을 없 애 는 것 입 니 다.즉,<pre><code><code><br/>String.prototype.trim = function () { <br/>return this.replace(/^[\s\t ]+/g, ''); <br/>} <br/></code></code></pre>c.여러 줄 의 일치 로 변경 합 니 다.즉,4.567913.상기 세 가지 개 법 결합 문 에서 시작 하 는 NFA 자료 로 바 뀌 었 습 니 다.우 리 는 trim 성능 에 문제 가 발생 하 는 원인 을 대충 알 수 있 습 니 다.양 어 는 끝 에 한정 되 어 JS 의 정규 엔진 을 끊임없이 삭제 시 키 고 재 귀 하 는 함정 이 생 길 수 있 습 니 다.이 재 귀 의 깊이 는 너무 깊 습 니 다.문자열 이 더 크 면 스 택 이 넘 칠 것 입 니 다.여러 줄 이 일치 할 수 있 을 뿐만 아니 라 성능 소모 도 크 지 않다.성능 에 문제 가 없습니다.이 정규 프로그램 을 쓴 사람의 측면 에서 볼 때 여러 줄 은 한 줄 로 바 꿀 빈 문자열 보다 훨씬 많 습 니 다.그래서 두 번 째 결론 은 맞 는 개량 이 어야 합 니 다.먼저 일치 하 는 문자열 의 시작 을 확인 하 는 것 은 효율 적 인 문제 가 없습니다.일치 가 끝 날 때 성능 문제 가 발생 하면 정규 와 전통 을 결합 시 켜 이 trim 성능 문 제 를 개선 할 수 있다.예 를 들 어<script type="text/javascript">/<![CDATA[ String.prototype.trim = function () { var s = this.replace(/^[\s\t ]+/g, ''); s 백 엔 드 에서 찾기 시작 하여 마지막 비 어 있 는 문자열 로 되 돌아 갑 니 다.코드 약.}/]></script>[Ctrl+A 선택:<a href="https://www.jb51.net/article/23421.htm" title="查看具体详情" rel="noreferrer noopener nofollow">引入外部Js需再刷新一下页面才能执行</a>]

좋은 웹페이지 즐겨찾기