정규 표현식을 통해 매크로 기능 제거

정규 표현식을 통해 매크로 기능 제거

\textbf.tex파일에서 모든 항목을 찾아서 삭제하고 싶습니다 . 인수 중괄호와 함께요 {}. 예를 들어 다음을 변경하고 싶습니다.

  1. \textbf{text}에게text

  2. \textbf{text \textit{textbis}}에게text \textit{textbis}

  3. \textbf{\textit{\textls[-5]{textbis}} text}에게\textit{\textls[-5]{textbis}} text

  4. \textbf{\textit{X{textbis}} text}\textit{X{textbis}} text( X문단 나누기는 어디에 있습니까? )

\\textbf\{([^}]*)\}에서 사용하려고 했으나 \1처음에 멈춰서 작동하지 않더군요 }.

답변1

@David Carlisle이 이미 언급했듯이임의의{ }잘 중첩된 쌍의 수 그러나 실용적인 관점에서 보면 최대 중첩 수준의 상한을 알 수 있습니다. 이 경계를 알고 있으면 최대 중첩 수준까지 잘 괄호로 묶인 표현식을 인식하는 정규 표현식을 작성할 수 있습니다.

\texbf{normal text}(최대 중첩 = 1)을 인식하려면 다음을 수행할 수 있습니다.

\textbf{([^{}]*)}

{괄호 안에 금지하는 것은 최대값보다 높은 중첩 수준과 일치하지 않도록 하는 예방 조치입니다.

최대 중첩 = 2와 일치시키려면 다음을 수행할 수 있습니다.

  1. 먼저 당신이 일치\\textbf\{
  2. 그런 다음 대괄호가 아닌 문자를 다음과 일치시킵니다.[^{}]*
  3. 이제 내용 일치를 마쳤고(실제 중첩 수준은 1임) 결말과 행복하게 일치할 수 있습니다.\}
  4. 또는 열린 브래킷이 있는 위치에 있을 수도 있습니다. 이 경우 중첩 수준 0과 일치시킨 다음 닫힌 대괄호를 일치시켜야 합니다.

2, 3, 4단계는 [^{}]*(\{[^{}]*\}[^{}]*)?반복될 수 있으므로 다음과 같은 항목을 일치시킬 수 있습니다.\textbf{bla\bla{bla}bla\bla{bla}bla}

따라서 최대 중첩 수준 = 2 정규식은 모두 다음과 같습니다.

\\textbf\{(([^{}]*(\{[^{}]*\}[^{}]*)?)*)\}

최대 중첩 = N이 2보다 큰 방식을 추정할 수 있습니다.

\\textbf\{(([^{}]*(\{RN\}[^{}]*)?)*)\}

어디

R1 = [^{}]*
RN = ([^{}]*(\{R(N-1)\}[^{}]*)?)*

예를 들어 max Nest = 3을 사용하면 다음과 같은 결과를 얻을 수 있습니다.

\\textbf\{(([^{}]*(\{(([^{}]*(\{[^{}]*\}[^{}]*)?)*)\}[^{}]*)?)*)\}

질문에서 언급한 모든 사례를 포착하기에 충분합니다.

답변2

탐욕스럽지 않은 수량자를 사용할 수 있다면

\\textbf\{(.*?)\}로 교체하다\1

좋아, Werner가 언급했듯이 이것은 중첩되지 않은 명령에서만 작동합니다. 내 생각에는 이에 대한 간단한 해결책은 없으며 파서 작업입니다.

어쨌든 Regex를 사용하여 이를 수행하려면 - \textbf대괄호가 아닌 기호를 사용되지 않는 기호로 바꾼 다음 마지막에 \textbf- 대괄호를 제거하고 기호를 다시 대괄호로 변경할 수 있습니다.

1) 모든 닫는 비괄호 \textbf}기호 A로 교체합니다.

2) 여는 괄호가 아닌 모든 \textbf부분을 {기호 B로 교체합니다.

3) 나머지 \textbf{}(부터 \textbf)를 아무것도 없는 것으로 교체하고,

4) 기호 A를 {기호 B 로 }


@1단계 및 2단계로 바꿉니다.

1단계: }-> Smybol A(제 예에서는 german) ö:

(?<=(?<!\\textbf)\{(?!.*?\{)).*?\}

이 표현식을 \1ö(이 표현식에 대한 더 나은 해결책을 찾지 못했습니다.)


그런 다음 2단계를 수행합니다. {-> 내 예에서는 기호 B(독일어)ä

(?<!\\textbf)\{(?!.*?\{)

이 표현식을 로 바꿉니다 ä.


중첩된 레벨 수만큼 이 단계를 다시 실행하세요. 그런 다음 나머지 단계를 따르십시오.


글쎄, 이것은 확실한 정규식이라기보다는 정규식 매크로이자 해결 방법에 가깝지만 작동할 것입니다.

관련 정보