จะทำการทดแทน regex บนสตริงใน "แมโคร" LO Basic ได้อย่างไร


1

ดูเหมือนว่าจะเป็นสิ่งที่ควรทำอย่างยิ่ง แต่ไม่ใช่ - แน่นอนไม่ชัดเจนว่าจะทำอย่างไร

ฉันต้องการเขียนฟังก์ชันใน Lotus Symphony Basic ที่ใช้สตริงรูปแบบการค้นหา regexp และสตริงการแทนที่และส่งคืนสตริงตามที่ได้รับการแก้ไขโดยการค้นหาและแทนที่ regex เหมือนs/search/replace/gอยู่ใน sed หรือ 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ไม่ได้ถูกแก้ไขได้โดยตรงและก็ไม่ได้อยู่ในส่วนใดของfound, searchหรือoptsวัตถุอย่างใดอย่างหนึ่ง

ฉันสามารถเขียนวนรอบสักครู่search.SearchForwareและทำการทดแทนตัวเองโดยใช้Mid()คำสั่ง - แต่แล้วฉันก็ถูก จำกัด ให้แทนที่ด้วยสตริงคงที่ (ไม่มีการอ้างอิงกลับหรือ&เว้นแต่ว่าฉันจะใช้พวกเขาด้วยตัวเองในแบบพื้นฐาน)

ดังนั้น:

  • การตั้งค่าทำอะไรopts.replaceStringจริงๆ
  • ถ้าเป็นเช่นนั้น:
    • มันทำอะไร?
    • ฉันจะเรียกคืนผลลัพธ์ได้อย่างไร

หมายเหตุ: คำถามนี้เกี่ยวกับการเขียนโปรแกรมใน Libre Office Basic เพื่อส่งคืนสตริงที่เปลี่ยนแปลงและไม่มีอะไรเกี่ยวข้องกับการทำการค้นหาและแทนที่ในเซลล์ด้วยส่วนติดต่อผู้ใช้ Libre Office Calc


@JimK ขอบคุณใช่ฉันพบว่าที่นี่เมื่อวานนี้ มีประโยชน์มาก & ให้ข้อมูล จริง ๆ แล้วฉันเขียนลูปที่คล้ายกัน แต่ใช้Mid()เป็นคำสั่งเพื่อแทนที่มากกว่าMid() เป็นฟังก์ชั่นการแยก มันใช้งานได้ แต่มันเงอะงะ - และดูเหมือนว่าไม่จำเป็นเพราะSearchOptionsโครงสร้างมีReplaceStringวัตถุจริงๆ ฉันไม่ได้รวมวงในคำถามของฉันเพราะฉันต้องการหลีกเลี่ยงการรับเคล็ดลับในการปรับปรุงเมื่อสิ่งที่ฉันต้องการคือข้อมูลเกี่ยวกับวิธีการใช้ประโยชน์จากreplaceStringเพื่อให้ฉันสามารถกำจัดมันได้อย่างสมบูรณ์
cas

คำตอบ:


1

ดูเหมือนว่าคุณจะมีวิธีแก้ปัญหาการทำงานอยู่แล้วดังนั้นให้ฉันพูดง่ายๆว่าสิ่งที่คุณกำลังมองหาไม่มีอยู่จริง ด้วยcom.sun.star.util.TextSearchXrayTool แสดงว่าไม่มีการค้นหาวัตถุหรือผลลัพธ์ที่พบมีวิธีการใด ๆ ที่ดำเนินการแทน

AFAICT, SearchOptions.replaceStringใช้สำหรับแทนที่เอกสารoDoc.replaceAll(oReplace)เท่านั้น มีXStringSubstitutionแต่ที่ใช้สำหรับPathSubstitutionเท่านั้น

ดังนั้นวิธีเดียวคือแทนที่ตัวคุณเอง ส่วนที่ 19.2 ของเอกสารแมโครของ Andrewให้ฟังก์ชันแทนที่สตริงตามดัชนี

โดยส่วนตัวฉันพบข้อ จำกัด แบบนี้ตลอดเวลากับ Basic ดังนั้นฉันชอบเขียนแมโครใน Python-UNO แทน การจัดการไฟล์เป็นอีกสิ่งหนึ่งที่ยากโดยไม่จำเป็นใน Basic

อาจเป็นความคิดที่ดีที่จะเพิ่มคำตอบของคุณเองซึ่งแสดงวิธีแก้ปัญหาที่ใช้Mid()ในกรณีที่คนอื่นพบคำถามนี้ จากนั้นอาจยอมรับคำตอบนั้นแทนที่จะเป็นของฉัน


+1 แต่นั่นเป็นความอัปยศ - พื้นฐานรับประกันว่าจะมีให้ใน LO Calc ตามค่าเริ่มต้นขณะที่ Python ไม่ได้ ถ้าฉันสามารถแจกจ่ายสิ่งของของฉันด้วยหมายเหตุ "คุณต้องติดตั้งสิ่งเพิ่มเติมเพื่อให้ทำงาน" นี่เป็นสาเหตุหลักอย่างหนึ่งของฉันในการใช้ LO Calc ในตอนแรกและทำไมฉันต้องฝืนตัวเองให้เจ็บปวดจากการใช้งานพื้นฐานและ GUI IDE ที่น่ากลัว นอกจากนี้ฉันไม่ต้องการเขียนสิ่งต่าง ๆ ที่ควรจะเป็นฟังก์ชั่นมาตรฐานเช่นย่อย RE ฉันจะต้องคิดใหม่ว่ามันคุ้มค่าที่จะทำกับ LO หรือแค่เริ่มต้นใหม่กับไพ ธ อนหรืออะไรก็ตาม
cas

"พื้นฐานรับประกันว่าจะมีให้ใน LO Calc โดยค่าเริ่มต้นในขณะที่ Python ไม่ได้เป็น" Python มาพร้อมกับ LO โดยค่าเริ่มต้นบน Windows และระบบ Linux และ Mac ส่วนใหญ่ติดตั้ง Python ไว้แล้ว ดังนั้นฉันไม่เห็นอะไรผิดปกติขึ้นอยู่กับ Python เมื่อเขียนมาโคร LO ฉันได้พัฒนาส่วนขยายขนาดใหญ่ (12K LOC) ที่ใช้อย่างน้อยหลายร้อยคนและได้รับข้อร้องเรียนเล็กน้อยเกี่ยวกับข้อเท็จจริงที่ว่ามันต้องใช้ Python README ของส่วนขยายบันทึกการพึ่งพา Python พร้อมกับ LO หรือ AOO รุ่นที่ต้องการ
Jim K
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.