RegEx

2016-04-05 21 views
1

ile tüm "{XE text text}" örneklerini bulun, Word belgesinde dönecek bir makro üzerinde çalışıyorum ve ayrıştırmak için tüm XE kodlarını seçiyorum.RegEx

Tüm bu tür metinleri almak için Find kullanmaya çalışıyorum, ancak normal aramalarım hiç çalışmıyor.

Denedim: </{ XE*/}>, <{*XE*}> boşuna.

{ XE "Superhero - means a person with some powers" } 
{ XE "Mountain is a tall hill, not always climbable." } 
{ XE "Hill is a smaller mountain; not always large." } 

Ben bunların her biri içinde döngü istiyorum, ve bulunan her ; sonra iki karakter ekleyin:

metin aşağıdaki gibi görünecektir, hatırlatmak için. RegEx'i kullanarak bunları nasıl bulabilirim?

Düzenleme: Ben Belgesi ile ilgili olarak bakan ettiğim bir şey

Sub escape_Special_Characters_in_XE_Text() 
Dim regExSearch$ 
Dim doc  As Word.Document 
Dim rngDoc As Word.Range, rngXE As Word.Range, rng As Word.Range 
Dim bFound As Boolean 
Dim iFieldCodeBegin& 

Set doc = ActiveDocument 
Set rngDoc = doc.Content 
Set rngXE = rngDoc.Duplicate 
bFound = True 
iFieldCodeBegin = 6   '? 
rngDoc.Find.ClearFormatting 
With rngDoc.Find 
     .Text = "^d XE" 
     '.Replacement.Text = "" 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
End With 

rngDoc.Find.Execute 
rngDoc.Select ' This selects the whole document for some reason? 

End Sub 

var mı: Nedense, .Find asla hatta aşağıda koduyla, yürütür? Neden hiçbir şey bulamıyor? Bir makroyu kaydedersem, bir değişken yerine Selection kullanır, ancak bunu tekrar tekrar çalıştırabilirim. Değişkenleri kullanmaya çalıştığımda, benimle aynı fikirde olmadığında.

+1

Özel alan kodu parantez "{}" düzenli karakterleri {} ve ms-word/kelime-vba yapmak kullanarak bulunabilir olmaz Kendileri, modern anlamda sözcük olarak RegEx'i uygulamamaktadır. Bakınız örn. http://stackoverflow.com/questions/14547866/vba-syntax-to-find-an-if-conditional-statement-field-code/36209603#36209603 –

cevap

4

Aslında ESC kombinasyonunu belirterek Word'ün Bul kullanarak bir alan kodunun başlayan diş telleri bulabilirsiniz: ^d

Ve Bul bir alanın başlangıç ​​noktası alır zaman, tüm alan seçimi dahildir/Menzil. Yani dönebilir aşağıdaki satırlar boyunca bir belgedeki tüm XE alanları:

Sub LoopAllXE() 
    Dim doc As word.Document 
    Dim rngDoc As word.Range 
    Dim rngXE As word.Range 
    Dim bFound As Boolean 
    Dim iFieldCodeBegin As Long 

    'Initialization 
    Set doc = ActiveDocument 
    Set rngDoc = doc.content 
    Set rngXE = rngDoc.Duplicate 
    bFound = True 
    iFieldCodeBegin = 6 
    With rngDoc.Find 
     .ClearFormatting 
     .ClearAllFuzzyOptions 
     .Text = "^d XE" 
     .Format = False 
     .wrap = wdFindStop 
    End With 

    'Get the XE fields' content 
    Do While bFound 
     bFound = rngDoc.Find.Execute 
     If bFound Then 
      Set rngXE = rngDoc.Duplicate 
      'Do something with the XE field content 
      'Below, the content is being trimmed of field code info 
      Debug.Print Mid(rngXE.Text, iFieldCodeBegin, _ 
          Len(rngXE) - iFieldCodeBegin - 1) 
      'Content in table cells needs to be processed differently 
      'in order to avoid looping endlessly on the first "found" 
      Do While rngDoc.Information(wdWithInTable) And bFound 
       rngDoc.Collapse wdCollapseEnd 
       'Remainder of cell content after XE-field 
       rngDoc.End = rngDoc.Cells(1).Range.End - 1 
       bFound = rngDoc.Find.Execute 
       Set rngXE = rngDoc.Duplicate 
       'Do something with the XE field content 
       'May make sense to put this in a separate procedure 
       Debug.Print Mid(rngXE.Text, iFieldCodeBegin, _ 
          Len(rngXE) - iFieldCodeBegin - 1) 
       If Not bFound Then 
        rngDoc.MoveStart wdCell, 1 
       End If 
      Loop 
      rngDoc.Collapse wdCollapseEnd 
      rngDoc.End = doc.content.End 
     End If 
    Loop 
End Sub 
+0

En basit dokümanı oluşturdum. her zaman, bir XE kodu ekledim (not: 'gizli metinim' (geriye doğru P sembolünün bir şeyi) varsa, görünür olan). O zaman yukarıda yaptığım basit kod çalışır. Maalesef, "canlı" dokümanımı kesinlikle paylaşamamıştım, ancak paylaşabileceğim bir ayrıştırılmış kopya elde etmeye çalışacağım (yardım teklifinizi gerçekten takdir ediyorum!). Ayrıca, hala rastgele aynı '.Find' parçası ile döngü karar vereceğiz. Ayrıca, FYI belgesinde bir grup Stilim var, bunu engeller miydi? – BruceWayne

+0

Özür dilerim, son soru - şimdi Alanın metnini yakalayabiliyorum ('Mid()' formülüyle, bunu bir String değişkenine kaydettim ('foundText = Mid (rngXE.text, iFieldCodeBegin, ...) Kodun içinde herhangi bir noktalı virgülü kaldırmak için bunun içinden geçebilirim, sonra alan metnini bu yeni, noktalı virgülsüz metin olarak "sıfırlar" mı? Bunu koyduktan sonra bunu bölümde yapacağım "Bir şeyler yap XE Alanı İçeriği ile ... "? – BruceWayne

+1

Noktalı virgüllerden kurtulmak için REPLACE işlevini kullanın - bir döngüye gerek yok! Bunun için kodumda iki yer var:" ana döngüde "biri diğeri tabloları işleyen bölüm, bu yüzden bu kodu farklı bir prosedüre koymak isteyebilirsiniz, bu yüzden iki kez yazmak zorunda kalmazsınız. "İçeriği sıfırlama" alan içeriği zor olabilir - sorun yaşarsanız lütfen Yeni soru.Görünümlerin artık yeniden yorumlanamaması nedeniyle bu yorumların bir kısmını tartışacağım ... –