Vì vậy, tôi chỉ mới bắt đầu hiểu Cụm từ thông dụng và tôi đã tìm thấy đường cong học tập khá dốc. Tuy nhiên, stackoverflow đã vô cùng hữu ích trong quá trình thử nghiệm của tôi. Có một macro từ cụ thể mà tôi muốn viết nhưng tôi đã không tìm ra cách để làm điều đó. Tôi muốn có thể tìm thấy hai từ trong vòng 10 hoặc hơn các từ của nhau trong một tài liệu và sau đó in nghiêng những từ đó, nếu các từ cách nhau hơn 10 từ hoặc theo thứ tự khác, tôi muốn macro không in nghiêng những lời đó.Macro Word Regex tìm hai từ trong phạm vi của nhau và sau đó in nghiêng những từ đó?
Tôi đã sử dụng các biểu thức chính quy sau:
\bPanama\W+(?:\w+\W+){0,10}?Canal\b
Tuy nhiên nó chỉ cho phép tôi vận dụng toàn bộ chuỗi như một tổng thể bao gồm từ ngẫu nhiên ở giữa. Ngoài ra hàm .Replace chỉ cho phép tôi thay thế chuỗi đó bằng một chuỗi khác không thay đổi kiểu định dạng.
Có người nào có kinh nghiệm hơn có ý tưởng về cách thực hiện công việc này không? Thậm chí có thể làm được không?
EDIT: Đây là những gì tôi có cho đến nay. Có hai vấn đề tôi đang gặp phải. Đầu tiên, tôi không biết cách chỉ chọn từ "Panama" và "Kênh" từ trong Cụm từ thông dụng phù hợp và chỉ thay thế những từ đó (chứ không phải từ trung gian). Thứ hai, tôi chỉ không biết làm thế nào để thay thế một Regexp được kết hợp với một định dạng khác, chỉ một chuỗi văn bản khác - có lẽ chỉ là kết quả của việc thiếu sự quen thuộc với các macro từ.
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
Ok, nhờ sự giúp đỡ từ Tim Williams dưới đây tôi có những giải pháp sau cùng, nó còn hơn cả một chút vụng về trong một số khía cạnh và nó hoàn toàn không có nghĩa là regexp tinh khiết nhưng nó không nhận được công việc hoàn thành. Nếu bất cứ ai có một giải pháp tốt hơn hoặc ý tưởng về làm thế nào để đi về điều này tôi muốn được mê hoặc để nghe nó mặc dù. Một lần nữa, vũ phu của tôi buộc thay đổi với việc tìm kiếm và thay thế tính năng là một chút xấu hổ thô nhưng ít nhất nó hoạt động ...
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
Đối tượng đối sánh có thuộc tính Chỉ mục cho bạn biết vị trí trong văn bản khớp xảy ra. Bạn có thể sử dụng nó để xử lý các phạm vi cụ thể để thay đổi định dạng của chúng. Nếu bạn cập nhật câu hỏi của mình để hiển thị mã hiện tại của bạn, ai đó có thể kêu gọi bằng các thay đổi được đề xuất. –
hiển thị cho tôi danh sách các từ bạn đang chạy regex. – jared
Có phải '' từ có nhiều hơn 10 từ'' hoặc '' từ có nhiều hơn 10 chữ cái '' hoặc '' câu có hơn 10 từ'' không? – Cylian