2016-04-19 8 views
2

私はライブラリFsVerbalExpressionsを使用していくつかの関数を書いています。プログラムでregExを構築しようとするのは苦労しています。プログラムでFsVerbalExpressionsライブラリを使用してF#正規表現を構築する

私は、文字列"Int. Bus. Mach"を持っている場合たとえば、私は期間および空白を削除することができますし、私が何をしたいのですがどのような配列

let splitString = [|"Int"; "Bus"; "Mach"|] 

で終わるそのようsplitStringから正規表現を構築しています結果は次のとおりです。

let hardCoded = 
    VerbEx() 
    |> startOfLine 
    |> then' "Int" 
    |> anything 
    |> whiteSpace 
    |> then' "Bus" 
    |> anything 
    |> whiteSpace 
    |> then' "Mach" 

hardCoded;; 
val it : VerbEx = 
    ^(Int)(.*)\s(Bus)(.*)\s(Mach) {MatchTimeout = -00:00:00.0010000; 
           Regex = ^(Int)(.*)\s(Bus)(.*)\s(Mach); 
           RegexOptions = None; 
           RightToLeft = false;} 

私の問題は、私は元の文字列が"This is a much bigger string"であれば、全体の正規表現は、コードから構築されたのではなく、ハードコーディングされているように、プログラムでこれを構築する方法を知らないということです。私は

 let test = 
      splitString 
      |> Array.map (fun thing -> VerbEx() 
             |> then' thing) 
      |> Array.toList 

で、個々の正規表現を作成することができますが、これはVerbEx()ではなく、上記の単一VerbEx()のリストです。

どのようにプログラムでFsVerbalExpressionsでregExを構築できるか知っていますか?

ご協力いただきありがとうございます。

答えて

5

このように考えてみましょう:最初の値であるVerbEx() |> startOfLineから始めて、一般的な形がanything |> whitespace |> then' wordのパターンを繰り返す必要があります。

また、帰納的に考えれば、一連の値が生成されます。各値はpreviousValue |> anything |> whitespace |> then' wordで表されます。つまり、シリーズの次の値は、以前の値で、変更が適用されます。そのようなシリーズの最後の要素があなたの最終的な答えです。

このような操作(各値は前のものの変更として表現されます)は、従来はfoldと呼ばれていました。そして案の定、F#が、この操作を実行するための標準ライブラリ関数を持っています

let applyChange previousValue word = 
    previousValue |> anything |> whitespace |> then' word 

let initialValue = VerbEx() |> startOfLine 

let finalAnswer = splitString |> Array.fold applyChange initialValue 

それとも、そのすべて一緒にロールバックすることができます:

let finalAnswer = 
    splitString 
    |> Array.fold 
     (fun previousValue word -> previousValue |> anything |> whitespace |> then' word) 
     (VerbEx() |> startOfLine) 
+0

私はF#の '適度に新たなんだ'と*確かに*新しい書き込み折りたたみこれは非常に役に立ちます*。ありがとう! – Steven

+0

これを少し短くすることもできます。それ以外の方法で折り返してエタを縮小することができます: 'VerbEx()|> startOfLine |> Array.foldBack(fun word - > anything >> whiteSpace >> then word)[|" Mach "; "バス"; "Int" |] ' – kaefer

+0

@kaefer:これは、親しみやすい説明のポイントを本当に打ち破り、本当のメリットはありません。 –

関連する問題