키워드 추가 링크

이 문 제 는 먼저 제 생각 을 말씀 드 리 고 건물 주의 사고 와. NET 에서 정규 적 으로 사용 할 때 주의해 야 할 부분 이 있 습 니 다. 키워드 의 수량 도 많 기 때문에 전체적으로 두 가지 실현 방식 이 있 습 니 다. 하 나 는 가장 바깥쪽 에서 키 워드 를 순환 하고 매번 조건 에 맞 는 키 워드 를 교체 하 는 것 입 니 다. 이렇게 매번 순환 합 니 다.원본 문자열 을 한 번 옮 겨 다 녀 야 합 니 다. 다른 하 나 는 교체 조건 에 맞 는 하위 문자열 을 한 번 에 찾 은 다음 에 키 워드 를 반복 해서 교체 하 는 것 입 니 다. 그러면 매번 처리 하 는 원본 문자열 이 상대 적 으로 작 지만 키 워드 는 한 번 에 옮 겨 다 녀 야 합 니 다. 원본 문자열 에 비해 키 워드 는 훨씬 작 기 때문에 일반적으로 뒤의 효율 이 높 습 니 다.탭 안의 내용 은 교체 에 참여 하지 않 습 니 다. 예 를 들 어 < p title = "키워드" > 키 워드 는 포함 되 어 있 지만 교체 하지 않 습 니 다.  2. 자체 링크 의 내용 은 교체 에 참여 하지 않 습 니 다. 예 를 들 어 < a > 키워드 < / a >  3. < pre > < / pre > 태그 의 내용 은 교체 에 참여 하지 않 습 니 다. 예 를 들 어 < pre > 키워드 < / pre >  건물 주가 바 꾸 려 는 키 워드 는 모두 이 세 가지 에 부합 되 지 않 는 하위 문자열 에 있 습 니 다. 그러면 방법 을 강구 하여 이 세 가지 상황 을 제외 한 하위 문자열 을 먼저 꺼 냅 니 다. 이때 하위 문자열 에 포 함 된 키 워드 는 바 꿀 수 있 습 니 다. 교체 수요 에 부합 되 지 않 는 조건 은 세 가지 밖 에 없 기 때문에 정규 표현 식 은 상기 세 가지 상황 을 제외 한 하위 문자열 을 꺼 낼 수 있 습 니 다.의뢰 방식 으로 교체 합 니 다. 건물 주의 네 번 째 수요 3. 가능 한 한 하나의 키 워드 를 한 편의 글 에서 하나만 링크 로 교체 합 니 다.이렇게 하면 건물 주의 요 구 를 만족 시 킬 수 있 을 뿐만 아니 라 매 라운드 순환 횟수 를 줄 이 고 건물 주의 사고 와. NET 에서 정규 사용 에 주의해 야 할 부분 도 토론 할 수 있다. 아마도 건물 주 는 정규 에서 의뢰 한 응용 을 잘 모 르 거나 어떻게 정규 를 통 해 앞의 세 가지 조건 을 제외 한 하위 꼬치 를 꺼 내 는 지 모 르 기 때문에 건물 주 는 먼저 캡 처 했다.재 조립 방식 은 의뢰 의 실현 원리 와 대체적으로 차이 가 많 지 않다. 다만 이런 실현 방식 의 효율 이 높 은 것 을 의뢰 하지 않 았 을 뿐이다. 다시 한 번 건물 주가 정규 사용 에 존재 하 는 문제점 을 말 해 보 자. 성능 문제 와 관련 될 때 다음 과 같은 몇 가지 측면 에 주의해 야 한다. 1. 정태 적 인 방법 을 사용 하지 말 아야 한다.반드시 명시 적 으로 Regex 대상 을 밝 혀 야 하 는 이 유 는 정적 방법 이 Regex 대상 을 임시로 만 들 고 요청 한 방법 을 호출 한 다음 에 이 대상 을 버 리 기 때 문 입 니 다.정적 방법 은 호출 될 때마다 정규 표현 식 을 다시 검사 해 야 하기 때문에 효율 적 인 결함 이 있 습 니 다.  기본적으로. NET Framework 는 캐 시 처 리 를 했 지만 기본 값 은 정규 표현 식 15 개 만 캐 시 합 니 다.  Regex.CacheSize = 123;  조정 하 겠 습 니 다. 그러나 이것 은 효율 문 제 를 해결 하 는 근본 적 인 방법 이 아 닙 니 다.  사전 컴 파일 은 컴 파일 시간 을 연장 하고 더 많은 메모 리 를 차지 하지만 일치 하 는 과정 을 가속 화 합 니 다.일반적으로 데이터 소스 가 비교적 크 고 정규 가 복잡 하 며 빈번 한 호출, 순환 에서 사용 할 때 사전 컴 파일 을 고려 할 수 있다.  물론 여러 곳 에서 호출 되 고 호출 이 빈번 한 경우 assembly 에 밀봉 하 는 것 을 고려 할 수 있다.  4. 원본 문자열 의 구조 가 명확 하지 않 으 면 쉽게 사용 하지 마 십시오. *?이런 비 탐욕 모드, 비 탐욕 모드 (exp) *?그리고 양사 의 내장 사용 이 부적 절하 면 무한 순환 역 추적 을 초래 할 수 있 습 니 다. 보통 정규 효율 함정 의 근원 입 니 다. 가능 한 한 배제 형 문자 그룹 [^...] 과 부정 적 인 정방 향 환시 (?! exp) 를 탐욕 모델 과 결합 하여 일반적인 상황 에서 <. +? > 를 실현 합 니 다.< [^ >] * > 가 없 는 효율 이 높 은 5. 일치 실 패 는 거 슬러 올 라 갈 필요 가 없 는 하위 표현 식 입 니 다. 경화 그룹 (? >...) 으로 실패 과정 을 가속 화하 고 거 슬러 올 라 가 는 것 을 피 합 니 다. 그러면 < [^ >] * > 는 보통 경화 그룹 을 통 해 최적화 할 수 있 습 니 다. < (? > [^ >] *) > 그래서 아래 부분 코드 는
C# code

    
    
    
    
for ( int i = 0 ; i < str1.Count; i ++ ) { tmp = new StringBuilder(str1[i]); if (Regex.Replace(tmp.ToString(), @" <.+?> " , "" ).Length > 5 ) // Regex tagReg = new Regex( @" <(?>[^>]*)> " , RegexOptions.Compiled); for ( int i = 0 ; i < str1.Count; i ++ ) { tmp = new StringBuilder(str1[i]); if (tagReg.Replace(tmp.ToString(), "" ).Length > 5 )

6. '|' 에서 '또는' 의 분기 구 조 를 취하 면 효율 에 대한 영향 도 매우 크다. 따라서 일반적인 상황 에서 분기 구 조 를 사용 할 때 가능 한 한 똑 같은 규칙 을 추상 화하 고 분기 의 복잡 도 를 간소화 해 야 한다.
C# code

    
    
    
    
( < a . +?</ a > ) | ( < pre( >| /s). +?</ pre > ) // < (a | pre)/b( ? :( ?!</? / 1 ).) *</ / 1 >

7. 순환 중 사용, 포획 그룹 이 반드시 사용 해 야 할 이유 가 없 을 때, 비 포획 그룹 으로 대체  
캡 처 그룹 이 일치 하면 일치 하 는 내용 을 한 그룹 에 저장 하여 나중에 참조 할 수 있 도록 합 니 다. 따라서 의미 없 는 캡 처 그룹 은 메모 리 를 사용 하여 효율 을 낮 출 수 있 습 니 다.  
그래서 순환 체 중 에...
C# code

    
    
    
    
reg2 = new Regex( @" ((^|>)[^<]+?)( " + _tag + " ) " , RegexOptions.IgnoreCase); // tmp.Insert(mat2.Index, mat2.Groups[ 1 ].Value + " <a href='/tag/ " + mat2.Groups[ 2 ].Value + " .htm'> " + mat2.Groups[ 2 ].Value + " </a> " ); // reg2 = new Regex( @" (?<=(?:^|>)(?:(?! " + _tag + " ).)*) " + _tag , RegexOptions.IgnoreCase); tmp.Insert(mat2.Index, " <a href='/tag/ " + mat2.Value + " .htm'> " + mat2.Value + " </a> " );

건물 주의 실현 사고 에 제한 을 받는다. reg 2 라 는 정규 는 반드시 동태 적 으로 생 성 되 어야 하기 때문에 순환 체 외 를 추출 할 방법 이 없고 이곳 은 성능 에 대한 영향 이 비교적 크다.
8. 또한. NET 에서 정규 표현 식 을 동적 으로 생 성 할 때 변수 에 정규 에서 구체 적 인 의미 가 있 는 문자 가 존재 하지 않도록 정규 해석 에 실패 하고 이상 한 문 제 를 던 질 때 Regex. Escape () 방법 으로 변 수 를 미리 처리 할 수 있 습 니 다.
C# code
reg2 = new Regex( @" (?<=(?:^|>)(?:(?! " + Regex.Escape(_tag) + " ).)*) " + Regex.Escape(_tag) , RegexOptions.IgnoreCase);

좋은 웹페이지 즐겨찾기