在F#中使用Regex过滤字符串

时间:2015-10-24 17:49:22

标签: regex f# functional-programming

我正在尝试使用正则表达式来过滤字符串列表中的所有字符串。这是我的函数,它接受一个字符串并过滤它

let filterWord wordToFilter = 
    Regex.Replace(wordToFilter, "[^a-zA-Z0-9/!\'?.-]", "");

因为我想将该函数应用于我的字符串列表中的每个元素,所以使用List.map似乎是有意义的。这是我尝试使用地图

let filteredWords = unfilteredWords |> List.map(fun x -> filterWord(x));

我希望该行将我的过滤器函数应用于我的列表中的每个字符串(unfilteredWords是一个字符串列表)但是我得到一个语法错误说

"Type mismatch. Expecting a
    string [] -> 'a    
but given a
    'b list -> 'c list    
The type 'string []' does not match the type ''a list'"

并且不知道为什么。这是完整的代码

open System;
open System.IO;
open System.Text.RegularExpressions;

(*Tests if an element is in a list*)
let isInList elementToFind listToCheck = 
    List.fold(fun a b -> a || b = elementToFind) false listToCheck;

(*Takes a string and filters it down to common text characters*)
let filterWord wordToFilter = 
    Regex.Replace(wordToFilter, "[^a-zA-Z0-9/!\'?.-]", "");

(*Main method of the program*)
[<EntryPoint>]
let main argsv =
    let input = File.ReadAllText("Alice in Wonderland.txt"); //Reads all the text into a single string
    let unfilteredWords = input.Split(' ');
    let filteredWords = unfilteredWords |> List.map(fun x -> filterWord(x));
    0;

任何帮助将不胜感激,谢谢!

编辑:显然将unfilteredWords的值更改为硬编码字符串数组可以修复它。问题是我不知道如何让它与拆分一起工作。

2 个答案:

答案 0 :(得分:1)

以下是修复方法:使用Array.map代替List.map

请注意,您可以使用F#.Split [|' '|]代替.Split(' ')

let input = "### $$$ Alice In Wonderland ,,,,";
let unfilteredWords = input.Split [|' '|]
let filteredWords = unfilteredWords |> Array.map(fun x -> filterWord(x));
printfn "%A" filteredWords;

请参阅IDEONE demo

我的演示中示例字符串的输出是

[|""; ""; "Alice"; "In"; "Wonderland"; ""|]

答案 1 :(得分:-1)

看到这个问题: F# Using List.map on an array of strings

我猜你应该使用Array.map或Seq.map而不是List.map