اگنس پرسید آیا راهی برای خط کشی خودکار روی همه موارد کلمه "بخش" و هر گونه اطلاعات جانبی پس از کلمه وجود دارد یا خیر. به عنوان مثال، یک سند ممکن است حاوی متنی مانند "بخش 2.3(b)(i)" یا "بخش 5.21" یا "بخش 12.12(a)" باشد و اگنس می خواهد این متن را پیدا کند و زیر همه آن خط کشیده شود.
یکی دو چیز برای امتحان کردن وجود دارد. اول از همه، میتوانید یک Find and Replace استاندارد انجام دهید، اما فقط در صورتی که بتوانید متن را کمی «استاندارد» کنید. بدون نوعی الگوی قابل تطبیق، عملاً امکان یافتن و جایگزینی وجود ندارد که تمام نمونههای ممکن از متن را پیدا کند.
با این حال، یک امکان، ضبط یک ماکرو است که به همه احتمالات نگاه می کند. لزوماً یک ماکرو ساده نیست، زیرا باید کلمه "بخش" را بلافاصله پس از آن یک فاصله، یک رقم، یک نقطه، ارقام بیشتر، و سپس (اختیاری) همه چیز تا و شامل یک پرانتز بسته را پیدا کند. این یک تحلیل متنی است که باید اتفاق بیفتد.
جایی که باید شروع کرد با جستجوی حروف عام است. عبارت جستجوی زیر کلمه بخش را به دنبال الگوی "شماره نقطه عدد" پیدا می کند:
Section [0-9]{1,}.[0-9]{1,}
اگر این الگوی جستجو در یک ماکرو استفاده شود، ماکرو میتواند پس از هر یافتن موفقیتآمیز متن، شروع به بسط دادن آنچه پیدا شده است کند و ببیند که آیا دارای نویسههای پرانتزی است یا خیر. ماکرو زیر این کار را انجام خواهد داد.
Sub ULWords()
Selection.Find.ClearFormatting
With Selection.Find
.Text = "Section [0-9]{1,}.[0-9]{1,}"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
While Selection.Find.Found
Selection.MoveRight Unit:=wdCharacter, _
Count:=1, Extend:=wdExtend
While Right(Selection.Text, 1) = "("
Selection.MoveRight Unit:=wdCharacter, _
Count:=1, Extend:=wdExtend
While Right(Selection.Text, 1) <> ")"
Selection.MoveRight Unit:=wdCharacter, _
Count:=1, Extend:=wdExtend
Wend
Selection.MoveRight Unit:=wdCharacter, _
Count:=1, Extend:=wdExtend
Wend
Selection.MoveRight Unit:=wdCharacter, _
Count:=-1, Extend:=wdExtend
Selection.Font.Underline = True
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.Find.Execute
Wend
End Sub
توجه داشته باشید که ماکرو از یک جستجوی عام در ابتدا برای یافتن همه نمونههای کلمه "بخش" و به دنبال آن الگوی "عدد نقطه عدد" استفاده میکند. اگر نمونه ای پیدا شود، آنگاه با یک کاراکتر گسترش می یابد. اگر آن کاراکتر یک پرانتز ابتدایی باشد، انتخاب تا زمانی که یک پرانتز بسته پیدا شود تمدید می شود. این فرآیند یافتن پرانتزهای باز/بستن ادامه مییابد، و هنگامی که مجموعهای دیگر قرار نگیرد، کل انتخاب توسعهیافته زیر خط کشیده میشود. این روند تا زمانی که کل سند جستجو شود ادامه می یابد.