\textbf
내 .tex
파일에서 모든 항목을 찾아서 삭제하고 싶습니다 . 인수 중괄호와 함께요 {}
. 예를 들어 다음을 변경하고 싶습니다.
\textbf{text}
에게text
\textbf{text \textit{textbis}}
에게text \textit{textbis}
\textbf{\textit{\textls[-5]{textbis}} text}
에게\textit{\textls[-5]{textbis}} text
\textbf{\textit{X{textbis}} text}
\textit{X{textbis}} text
(X
문단 나누기는 어디에 있습니까? )
\\textbf\{([^}]*)\}
에서 사용하려고 했으나 \1
처음에 멈춰서 작동하지 않더군요 }
.
답변1
@David Carlisle이 이미 언급했듯이임의의{
}
잘 중첩된 쌍의 수 그러나 실용적인 관점에서 보면 최대 중첩 수준의 상한을 알 수 있습니다. 이 경계를 알고 있으면 최대 중첩 수준까지 잘 괄호로 묶인 표현식을 인식하는 정규 표현식을 작성할 수 있습니다.
\texbf{normal text}
(최대 중첩 = 1)을 인식하려면 다음을 수행할 수 있습니다.
\textbf{([^{}]*)}
{
괄호 안에 금지하는 것은 최대값보다 높은 중첩 수준과 일치하지 않도록 하는 예방 조치입니다.
최대 중첩 = 2와 일치시키려면 다음을 수행할 수 있습니다.
- 먼저 당신이 일치
\\textbf\{
- 그런 다음 대괄호가 아닌 문자를 다음과 일치시킵니다.
[^{}]*
- 이제 내용 일치를 마쳤고(실제 중첩 수준은 1임) 결말과 행복하게 일치할 수 있습니다.
\}
- 또는 열린 브래킷이 있는 위치에 있을 수도 있습니다. 이 경우 중첩 수준 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)\{(?!.*?\{)
이 표현식을 로 바꿉니다 ä
.
중첩된 레벨 수만큼 이 단계를 다시 실행하세요. 그런 다음 나머지 단계를 따르십시오.
글쎄, 이것은 확실한 정규식이라기보다는 정규식 매크로이자 해결 방법에 가깝지만 작동할 것입니다.