선행 문자열 (책 색인의 경우)에서 조건부 하나 이상 (쉼표로 구분)을 제외한 모든 숫자를 늘립니다.

터틀

다음 내용이 포함 된 파일의 모든 페이지 번호고정 된 양만큼 늘리려 고합니다 (책의 색인입니다).

Adam and Eve 42-44 (그림 14, 15)

바티칸 사도 도서관 Cod. Gr. 1613 31 31 (Abb. 8)

함부르크, 주립 도서관 Ms. 151 in scrin. 35 (그림 11)

Ávila 10, 18의 St. Theresa 번역 (그림 2, 세부 사항 p. 8)

파일에는 연도, 숫자 등의 숫자가 포함되어 있습니다. 그러나 페이지 번호

  • "Abb."또는 "Ms."가 앞에 나오지 않습니다.
  • 3 자리 이하

페이지 번호에 숫자 4를 추가하고 싶습니다.

Adam and Eve 46-48 (그림 14, 15)

바티칸 사도 도서관 Cod. Gr. 1613 35 35 (Abb. 8)

함부르크, 주립 도서관 Ms. 151 in scrin. 39 (그림 11)

Ávila 14, 22의 St. Theresa 번역 (그림 2, 세부 사항 p. 12)

구두 규칙은 다음과 같을 수 있습니다. 숫자가 3 자리 이하이고 앞에 "Abb. | Ms."또는 ","로 구분 된 다른 숫자가 앞에 나오지 않는 경우 모든 숫자에 4를 추가하십시오. Abb. | 양. "

다음 줄

perl -pe 's/(?<!Abb. )(\b\d{1,3}\b)/$1+4/eg' original.md

생산하다

Adam und Eva 46--48 (Abb. 14, 19)
Biblioteca Apostolica Vaticana Cod. gr. 1613 35 35 (Abb. 8)
Hamburg, Staatsbibliothek Ms. 155 in scrin. 39 (Abb. 11)
Transverberation der Hl. Theresa von Ávila 14, 22 (Abb. 2, Detail S. 12)

두 가지 문제가 남아 있으며 첫 번째 문제가 가장 시급합니다.

  1. 1 행의 두 번째 숫자는 물론 4만큼 증가했습니다.하지만이 문제를 해결하는 방법을 모르겠습니다. 중간 부분을 같은 것으로 확장하고 (\b\d{1,3}\b),?\s?(\b\d{1,3}\b)?두 번째 숫자를으로 참조 할 수 $2있다는 것을 알고 있지만 대체에서 구분 쉼표 (존재하는 경우)를 처리하는 방법을 모르겠습니다.
  2. "Ms."다음의 숫자가 4만큼 증가했습니다. 그러나 부정적인 lookbehind를로 변경하면 이러한 구현에 대한 대안을 알 수 없다는 (?<!(Abb. |Ms. ))오류가 발생 Variable length lookbehind not implemented in regex m/(?<!(Abb. |Ms. ))(\b\d{1,3}\b)/ at -e line 1.합니다.

이 두 가지 문제에 대한 도움을 주시면 감사하겠습니다!

ctwheels

다음 정규식을 사용할 수 있습니다.

여기에서 사용중인 정규식 참조

(?:Abb|Ms)\.\s+\d{1,3}(?:,\s+\d{1,3}\b)*(*SKIP)(*FAIL)|\b\d{1,3}\b

이 정규식은 다음과 같은 방식으로 작동합니다.

  • (?:Abb|Ms)Abb또는 Ms문자 그대로 일치
  • \.\s+리터럴 .문자와 하나 이상의 공백 문자를 찾습니다.
  • \d{1,3} 1 ~ 3 자리 일치
  • (?:,\s+\d{1,3}\b)* 다음 비 캡처 그룹을 여러 번 일치시킵니다.
    • ,\s+\d{1,3}\bMatch ,, 뒤에 공백 문자가 한 번 이상오고 1 ~ 3 자리 숫자가오고 단어 경계를 사용하여 숫자의 끝을 지정합니다.
  • (*SKIP) 해당 위치를지나 역 추적하려는 경우 정규식이 현재 일치를 포기하도록하는 제어 동사 (즉,이 문자열과 일치했으며 두 번째 옵션이 일치하지 않도록 함)
  • (*FAIL) 이 일치를 실패하게하여 현재 일치가 결과에서 제외되도록하는 제어 동사

두 번째 옵션은 실제로 일치하는 것입니다 \b\d{1,3}\b.-각면을 단어 경계로 주장하는 1 ~ 3 자리 숫자 사이의 일치.


경우 \b제대로 모든 위치와 일치하지 않습니다, 당신은 대체 할 수 있습니다 \b와 함께 (?:(?<=\D)|^)이전과 (?=\D|$)각각 단어 경계를 진행하기 위해 :

여기에서 사용중인 정규식 참조

(?:Abb|Ms)\.\s+\d{1,3}(?:,\s+\d{1,3}(?=\D|$))*(*SKIP)(*FAIL)|(?:(?<=\D)|^)\d{1,3}(?=\D|$)

이러한 lookbehind / lookahead는 숫자가 아닌 문자 또는 문자열의 시작 / 끝에 대한 앵커가 이전 / 다음 위치에 존재한다고 주장함으로써 작동합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관