2013-08-25 2 views
1

텍스트의 앵커에 대한 링크로 대체하려는 많은 참조가 있습니다. 링크는 매우 정규 형식이므로 매우 스크립트가 있어야합니다.반복 된 정규 표현식이 경계 내에서 바뀝니다.

"[44]"참조는 다음의 html 코드로 대체해야합니다 : [<a href="ref44">44</a>].

그만큼 간단합니다. 역 참조로 간단하게 대체 할 수 있습니다. 하지만 정규식 (vim dialect, python 또는 ... perl 일 필요가 있습니다. 공포입니다!)이 다음과 유사한 링크로 변환 할 수 있습니다 : [44,45,77,91]? 즉, 링크 그룹이 대괄호 쌍으로 둘러싸인 번호 당 하나의 링크입니다.

이것은 (이론적으로 제한이없는) 메모리를 포함하기 때문에 FSM과 1 : 1을 매핑하지 않으므로 정규식이 아닌 일종의 푸시 다운 - 오토 마톤에 의해 처리되어야하지만 일부 방언은 훨씬 더 많이 사용됩니다 강력한, 그래서 ...

답변

1

교체가 더 이상 이루어지지 않을 때까지이 정규식을 다시 실행할 수 있습니다.

정규식 : (\[(?:<a(?=\s|>)(?:[^>=|&)]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>.*?<\/a>,)*)(\d+)([,\]])

로 교체 : $1<a href="ref$2">$2</a>$3

enter image description here

그룹 1을 캡처 부분은, 이벤트에게 가장 정교한 복잡한 앵커 태그와 일치합니다.

샘플 텍스트

[22][44,45,77,91] 

교체

처음 후 :

[<a href="ref22">22</a>][<a href="ref44">44</a>,45,77,91] 
012 3,516,

두 번째 시간 :

[<a href="ref22">22</a>][<a href="ref44">44</a>,<a href="ref45">45</a>,77,91] 

셋째 시간 :

[<a href="ref22">22</a>][<a href="ref44">44</a>,<a href="ref45">45</a>,<a href="ref77">77</a>,91] 

넷째 시간 :

[<a href="ref22">22</a>][<a href="ref44">44</a>,<a href="ref45">45</a>,<a href="ref77">77</a>,<a href="ref91">91</a>] 
+0

잘 했어! 하지만 당신은 똑같은 정규 표현식에서 가능하지 않다고 말하는 것입니다, 그렇죠? 기본적으로 해당 정규식을 통해 문자열을 반복하여 문자열이 변경되지 않았는지 확인합니다. 그렇다면 당신은 일종의 해결책이 될 수 없다고 대답합니다. – oligofren

+0

이것이 사용되는 언어를 모른 채, 정확히 말하고있는 것입니다. 단일 표현식을 사용하여이 작업을 수행 할 때 발생하는 문제는 괄호로 묶인 잠재적으로 무한한 수의 값과 일부 언어가 정규 표현식을 구현할 때 갖는 제한 사항을 처리하는 것입니다. –

+0

그래, 정규 표현식의 텍스트 북 정의가 FSM (무제한 메모리/상태를 처리 할 수 ​​없음)과 같다고 예상했었다. – oligofren