LO 기본 "매크로"의 문자열에서 정규식 대체를 수행하는 방법은 무엇입니까?

LO 기본 "매크로"의 문자열에서 정규식 대체를 수행하는 방법은 무엇입니까?

이는 수행하기가 매우 쉬워야 하는 작업처럼 보이지만 그렇지 않습니다. 어쨌든 이를 수행하는 방법은 확실하지 않습니다.

문자열, 정규식 검색 패턴 및 대체 문자열을 사용하여 정규식 검색 및 대체에 의해 수정된 문자열을 반환하는 함수를 LibreOffice Basic에서 작성하고 싶습니다. s/search/replace/gsed나 Perl과 같습니다 .

몇 시간 동안 심연의 문서를 이해하려고 노력한 끝에 다음과 같은 결과를 얻었습니다.

Function ReSub (T as String, S as String, R as String) As String
   Dim result as String

   ' In other languages, this is trivially easy.  perl has an s/// operator,
   ' and most other languages have a function call. e.g.
   '
   '   perl:   $result = ($T =~ s/$S/$R/g);
   '   python: result = re.sub(S,R,T)

   search = CreateUnoService("com.sun.star.util.TextSearch")
   opts = CreateUnoStruct("com.sun.star.util.SearchOptions")

   opts.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP

   opts.searchString  = S
   opts.replaceString = R

   search.setOptions(opts)

   found = search.searchForward(T, 0, Len(T))

   ' result = ??????????????
   ReSub = result

End Function

IDE에서 이 단계를 단계별로 실행하면 정상적으로 실행되는 것으로 표시되지만 수정된 결과 문자열을 어디서 얻을 수 있는지는 알 수 없습니다. 직접 수정되지 않으며 , 또는 개체 T에도 없습니다 .foundsearchopts

while 루프를 작성 search.SearchForware하고 문을 사용하여 직접 대체를 수행할 수 있습니다 Mid(). 하지만 그런 다음 고정 문자열로 바꾸는 것으로 제한됩니다( &기본적으로 직접 구현하지 않는 한 역참조 또는 가 없음).

그래서:

  • opts.replaceString실제로 설정이 이루어지나요?~하다아무것?
  • 그렇다면:
    • 그것은 무엇을 하는가?
    • 수행한 작업의 결과를 어디서/어떻게 검색합니까?

참고: 이 질문은프로그램 작성Libre Office Basic에서는 변경된 문자열을 반환하고전혀 아무것도Libre Office Calc 사용자 인터페이스를 사용하여 셀을 검색하고 바꾸는 작업을 수행합니다.

답변1

이미 작동하는 솔루션이 있는 것 같으므로 찾고 있는 솔루션이 존재하지 않는 것 같다고 간단히 말씀드리겠습니다. 를 사용하면 com.sun.star.util.TextSearchXrayTool은 검색 개체나 발견된 결과에 대체를 수행하는 메서드가 없음을 보여줍니다.

AFAFICT,SearchOptions.replaceString는 문서에서 바꾸는 데에만 사용됩니다(예: ) oDoc.replaceAll(oReplace). 있지만 XStringSubstitution그것은 단지 용도로만 사용됩니다.경로 대체.

따라서 유일한 방법은 스스로 교체하는 것입니다. 섹션 19.2Andrew의 매크로 문서문자열을 인덱스로 바꾸는 기능을 제공합니다.

개인적으로 저는 Basic에서 항상 이런 종류의 제한에 직면하기 때문에 대신 Python-UNO에서 매크로를 작성하는 것을 선호합니다. 파일 처리는 Basic에서 불필요하게 어려운 또 다른 작업입니다.

Mid()다른 사람이 이 질문을 찾을 경우를 대비해 사용하는 솔루션을 보여주는 자신만의 답변을 추가하는 것이 좋습니다 . 그러면 아마도 내 대답보다는 그 대답을 받아들일 것입니다.

관련 정보