Python과 다양한 언어에서 완벽하게 작동하지만 정규식 (예 : 엔진)에 대한 구현에 필요한 하위 일치 항목을 캡처하지 못하는 정규식 패턴이 있습니다. 어떤 것은 JavaScript와 거의 동일하다). 다음과 같이 문제의 패턴은 다음과 같이Submatch 문제를 해결하기 위해 VBScript/Javascript Regex의 차이점 이해
"Sincerely,[\s\n]+([\w\.]+)\s+(\w+)\s+(.+)[\s\n]+(\d+\s.+)[\s\n]+(.+)"
예 테스트 케이스는 다음과 같습니다
email received 3/30/17:
Dear Sir,
Hello
Sincerely,
Mr. Robert Thomas
1104 Madison Avenue
New York, NY 10021
email received 3/30/17:
Dear Sir,
Hello
Sincerely,
Ms. Angela Carraway
402 Arlington Drive
Concord, MA 01742
목적은 변수 키워드 다음에이 예 일치 만점에 5 개 하위 그룹을 추출하는 글로벌 정규식입니다 여기는 "근실하게"입니다. 소그룹은 Ms.
(첫 번째 하위 그룹), Angela
(두 번째 하위 그룹), Carraway (세 번째 하위 그룹), 402 Arlington Drive (네 번째 하위 그룹), Concord, MA 01742 (다섯 번째 하위 그룹)이어야합니다. 파이썬에서는 Regex 테스터에서 5 개의 그룹을 완벽하게 일치 시키지만 VBScript (JavaScript 엔진)의 경우 전체 문자열을 일치로 일치하지만 하위 그룹은 전혀 갖지 않습니다. 따라서 Excel VBA 매크로에서 하위 일치 항목을 호출하여 셀에 쓰면 모든 텍스트가 뒤죽박죽이되어 몇 개의 셀로 들어갑니다. 내가 도대체 뭘 잘못하고있는 겁니까? 하위 그룹을 캡처하지 못하게하는 일부 문자가 누락 되었습니까? 그렇다면이 두 엔진 사이의 중요한 차이점은 무엇입니까? 그래서 나는 이것을 피할 수 있습니다. 어떻게이 테스트 케이스에서이 패턴을 고칠 수 있습니까? 나는 온라인상의 차이점에 대해 읽으려고 노력했지만, 모든 것은 내가 가지고있는 이슈를 일으키는 작은 차이 만있는 것 같다. 내가 차이점/문제를 분리 할 수 없기 때문에 어떤 도움이라도 대단히 감사하겠습니다. 고맙습니다!
편집 : 이것은 결과의 사진이
Sub regex()
Dim docxinput As String
Dim keyword As Variant
Dim patterninput As Variant
Dim pattern As String
Dim regex As New RegExp
docxinput = Application.GetOpenFilename(Title:="Step #1: Enter Word Document Input File Name")
Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document
Dim strInput As String
Set wrdApp = CreateObject("Word.Application")
wrdApp.Visible = False
Set wrdDoc = wrdApp.Documents.Open(docxinput)
strInput = wrdDoc.Range.Text
Debug.Print (strInput)
wrdDoc.Close 0
Set wrdDoc = Nothing
wrdApp.Quit
Set wrdApp = Nothing
pattern = "Sincerely,[\s\n]+([\w\.]+)\s+(\w+)\s+(.+)[\s\n]+(\d+\s.+)[\s\n]+(.+)"
Dim objMatches As MatchCollection
With regex
.Global = True
.MultiLine = True
.IgnoreCase = False
.pattern = pattern
End With
Set objMatches = regex.Execute(strInput)
Dim row As Variant
Dim SubMatches As Variant
row = 2
For Each SubMatches In objMatches
Cells(row, 1).Value = objMatches(0).SubMatches(0)
Cells(row, 2).Value = objMatches(0).SubMatches(1)
Cells(row, 3).Value = objMatches(0).SubMatches(2)
Cells(row, 4).Value = objMatches(0).SubMatches(3)
Cells(row, 5).Value = objMatches(0).SubMatches(4)
row = row + 1
Next
End Sub
: 다음은 정규식을 사용 VBA 코드입니다. 보시다시피 첫 번째 두 개의 하위 그룹이 작동하지만 정규 표현식 (또는 최소한 생각하면)은 그룹화 오류로 실행되고 다른 내용의 거의 대부분이 다음 열로 덤프됩니다. 그런 다음 오류가있는 네 번째 열로 이동합니다. 이것은 코드 반복 또는 정규식 자체에 문제가 있습니까? 나는 코드 문제를 해결하기 위해 시도하고 정규식 이외의 텍스트를 올바르게 올릴 수없는 이유를 찾을 수 없습니다. 이견있는 사람?
정규식을 실행하고 서브 쿼리를 검색하는 VBA 코드를 게시 할 수 있습니까? –
@RichHolton VBA를 실행할 때 얻은 결과 그림과 함께 코드 및 추가 설명문을 보여주는 원본 게시물을 편집했습니다. 이견있는 사람? –
텍스트에 \ n이 아닌 다른 줄이있는 것으로 의심되어 세 번째 그룹 (. *)이 너무 많이 캡처 한 다음 나머지를 던집니다. 확인해 볼 수 있니? –