तो, मैं नियमित अभिव्यक्तियों को समझना शुरू कर रहा हूं और मुझे सीखने की वक्र काफी हद तक मिल गई है। हालांकि, मेरे प्रयोग की प्रक्रिया में स्टैक ओवरफ्लो बेहद सहायक रहा है। एक विशेष शब्द मैक्रो है जिसे मैं लिखना चाहता हूं लेकिन मुझे ऐसा करने का कोई तरीका नहीं पता है। मैं दस्तावेज़ में एक दूसरे के शब्दों के दो या दो शब्दों के भीतर दो शब्दों को खोजने में सक्षम होना चाहता हूं और फिर उन शब्दों को इटैलिक कर सकता हूं, यदि शब्द 10 से अधिक शब्द अलग हैं या एक अलग क्रम में हैं, तो मै मैक्रो को इटैलिकिस करना नहीं चाहता वो शब्दरेगेक्स वर्ड मैक्रो जो दो शब्दों को एक-दूसरे की सीमा के भीतर पाता है और फिर उन शब्दों को इटैलिक करता है?
मैं निम्नलिखित नियमित अभिव्यक्ति का उपयोग किया गया:
\bPanama\W+(?:\w+\W+){0,10}?Canal\b
हालांकि यह केवल मेरे बीच में यादृच्छिक शब्दों सहित एक समग्र रूप से पूरी स्ट्रिंग में हेरफेर करने देता है। इसके अलावा। Resplace फ़ंक्शन केवल मुझे उस स्ट्रिंग को एक अलग स्ट्रिंग के साथ बदलने देता है जो स्वरूपण शैलियों को नहीं बदलता है।
क्या किसी और अनुभवी व्यक्ति को यह विचार है कि यह काम कैसे करें? क्या यह करना भी संभव है?
संपादित करें: यहाँ क्या मैं अब तक है। मेरे पास दो समस्याएं हैं I सबसे पहले मुझे नहीं पता कि मिलान किए गए नियमित अभिव्यक्ति के भीतर से केवल "पनामा" और "नहर" शब्द का चयन कैसे करें और केवल उन शब्दों को बदलें (और मध्यवर्ती शब्द नहीं)। दूसरा, मुझे नहीं पता कि एक रेगेक्स को कैसे बदला जाए, जो किसी भिन्न प्रारूप से मेल खाता है, केवल टेक्स्ट की एक अलग स्ट्रिंग - संभवतः शब्द मैक्रोज़ के साथ परिचितता की कमी के परिणामस्वरूप।
Sub RegText()
Dim re As regExp
Dim para As Paragraph
Dim rng As Range
Set re = New regExp
re.Pattern = "\bPanama\W+(?:\w+\W+){0,10}?Canal\b"
re.IgnoreCase = True
re.Global = True
For Each para In ActiveDocument.Paragraphs
Set rng = para.Range
rng.MoveEnd unit:=wdCharacter, Count:=-1
Text$ = rng.Text + "Modified"
rng.Text = re.Replace(rng.Text, Text$)
Next para
End Sub
ठीक है, टिम विलियम्स से मदद करने के लिए नीचे दिए गए मैं निम्नलिखित समाधान एक साथ मिल गया धन्यवाद, यह कुछ मामलों में एक छोटे से अधिक से अधिक अनाड़ी है और यह कोई शुद्ध regexp तरह से है, लेकिन इसे मिल करता है काम हो गया। अगर किसी के पास इस बारे में बेहतर समाधान या विचार है कि इस बारे में कैसे जाना है, तो मैं इसे सुनने के लिए मोहक हूं। फिर, मेरे जानवर खोज के साथ परिवर्तन के लिए मजबूर और सुविधा की जगह एक छोटे से शर्मनाक कच्चे है लेकिन कम से कम यह काम करता है ...
Sub RegText()
Dim re As regExp
Dim para As Paragraph
Dim rng As Range
Dim txt As String
Dim allmatches As MatchCollection, m As match
Set re = New regExp
re.pattern = "\bPanama\W+(?:\w+\W+){0,13}?Canal\b"
re.IgnoreCase = True
re.Global = True
For Each para In ActiveDocument.Paragraphs
txt = para.Range.Text
'any match?
If re.Test(txt) Then
'get all matches
Set allmatches = re.Execute(txt)
'look at each match and hilight corresponding range
For Each m In allmatches
Debug.Print m.Value, m.FirstIndex, m.Length
Set rng = para.Range
rng.Collapse wdCollapseStart
rng.MoveStart wdCharacter, m.FirstIndex
rng.MoveEnd wdCharacter, m.Length
rng.Font.ColorIndex = wdOrange
Next m
End If
Next para
Selection.Find.ClearFormatting
Selection.Find.Font.ColorIndex = wdOrange
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Italic = True
With Selection.Find
.Text = "Panama"
.Replacement.Text = "Panama"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Font.ColorIndex = wdOrange
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Italic = True
With Selection.Find
.Text = "Canal"
.Replacement.Text = "Canal"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Font.ColorIndex = wdOrange
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.ColorIndex = wdBlack
With Selection.Find
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
मैच ऑब्जेक्ट में एक इंडेक्स प्रॉपर्टी है जो आपको बताती है कि मैच में टेक्स्ट कहां हुआ था। आप अपने स्वरूपण को बदलने के लिए विशेष श्रेणियों को संबोधित करने के लिए इसका उपयोग कर सकते हैं। यदि आप अपना मौजूदा कोड दिखाने के लिए अपना प्रश्न अपडेट करते हैं तो कोई सुझाए गए परिवर्तनों के साथ झुका सकता है। –
मुझे उन शब्दों की सूची दिखाएं जिन्हें आप रेगेक्स चालू कर रहे हैं। – jared
क्या यह शब्द '10 से अधिक शब्द' हैं या 'शब्द 10 से अधिक अक्षर हैं 'या' वाक्य 10 से अधिक शब्द हैं'? – Cylian