1

次の正規表現の理由を知りたい:

\b\w{7}\b\s[1]\s[\S\s]+?(?=WHAT WHERE WHAT WHERE WHAT\,\sWHERE\sWHAT.)

と:

\b\w{7}\b\s[1]\s[\S\s]+?(?=WHAT WHERE WHAT WHERE WHAT\,\sWHERE\sWHAT.|HOW WHO HOW WHO HOW\,\sWHO\sHOW\.)

次のテスト文字列では問題なく動作するようです:

THIS THAT THIS THAT THIS,
THAT
THIS.

CHAPTER 1

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 2

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 3

Text text text 2 text text text 3 text text text 4 text text text.

WHAT WHERE WHAT WHERE WHAT,
WHERE
WHAT.

CHAPTER 1

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 2

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 3

Text text text 2 text text text 3 text text text 4 text text text.

HOW WHO HOW WHO HOW,
WHO
HOW.

CHAPTER 1

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 2

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 3

Text text text 2 text text text 3 text text text 4 text text text.

IF OR IF OR IF.

CHAPTER 1

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 2

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 3

Text text text 2 text text text 3 text text text 4 text text text.

TO FOR TO FOR
TO FOR TO FOR.

CHAPTER 1

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 2

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 3

Text text text 2 text text text 3 text text text 4 text text text.

IN UNDER IN
UNDER IN UNDER.

CHAPTER 1

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 2

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 3

Text text text 2 text text text 3 text text text 4 text text text.

LEFT RIGHT LEFT
RIGHT LEFT.

CHAPTER 1

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 2

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 3

Text text text 2 text text text 3 text text text 4 text text text.

UP DOWN UP DOWN UP
DOWN.

CHAPTER 1

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 2

Text text text 2 text text text 3 text text text 4 text text text.

CHAPTER 3

Text text text 2 text text text 3 text text text 4 text text text.

THE END.

しかし、5MB を超えるファイルに同じタイプの Expression を使用すると失敗します。

私が使用しているVBScriptは次のとおりです。

Option Explicit

Dim strPath : strPath = "myFile.txt"

If Instr(1, WScript.FullName, "CScript", vbTextCompare) = 0 Then
    With CreateObject("WScript.Shell")
        .Run "cmd.exe /k cscript //nologo """ & WScript.ScriptFullName & """", 1, False
        WScript.Quit
    End With
Else
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(strPath) Then 
            Call Main(strPath)
        Else
            WScript.Echo "Input file doesn't exists"
        End If
    End With
End If

Private Sub Main(filePath)
    Dim TempDictionary, Books, Book, b
    Set TempDictionary = CreateObject("Scripting.Dictionary")
    Set Books = RegEx(GetFileContent(filePath),"\b\w{7}\b\s[1]\s[\S\s]+?THE SECOND BOOK OF MOSES")
    If Books.Count > 0 Then 
        For Each Book In Books 
            WScript.Echo Replace(Left(Book.Value,70),vbCrLf," ")
        Next 
    Else 
        WScript.Echo "Document didn't contain any valid books" 
        WScript.Quit 
    End If 
End Sub

Private Function GetFileContent(filePath)
    Dim objFS, objFile, objTS
    Set objFS = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFS.GetFile(filePath)
    Set objTS = objFile.OpenAsTextStream(1, 0)
    GetFileContent = objTS.Read(objFile.Size)
    Set objTS = Nothing
End Function

Private Function RegEx(str,pattern)
    Dim objRE, Match, Matches
    Set objRE = New RegExp
    objRE.Pattern = pattern
    objRE.Global = True
    Set RegEx = objRE.Execute(str)
    WScript.Echo objRE.Test(str)
End Function

私が使用しているエディターはこちらです: http://www.regexr.com/

Q: 何をしようとしていますか?

A: 2 つの文字列間のすべてをキャプチャするスマート正規表現コードに基づいて、任意のテキスト ファイルを複数の文字列チャンクに分割できるようにしたいと考えています。最初の文字列決定子は固定語、つまり「CHAPTER 1」ですが、2 番目の文字列決定子は固定されていません。2 番目の文字列決定子は固定されておらず、変更されていますが、既知です。配列に配置してから解析できます。私が抱えている問題は、ルックアラウンド (?=) がエスケープするか、ループに陥っているように見えることです。「|」で遊んでいます この OP の最初にある 2 番目の RegEx でわかるように、演算子です。私が作業しているテストファイルは、問題なく解析できるようです。問題ない。しかし、私が扱っているより大きなファイルは...わかりません。何かがうまくいかない。

4

0 に答える 0