【问题标题】:Using Regex in F# to Filter Strings在 F# 中使用正则表达式过滤字符串
【发布时间】:2015-10-27 04:36:15
【问题描述】:

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

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 的值更改为硬编码字符串数组可以修复它。问题是我不知道如何使它与拆分一起使用。

【问题讨论】:

  • 顺便说一句,在你的正则表达式末尾添加一个+,就在]之后,以稍微优化替换过程。
  • 我认为您需要发布完整的相关代码。 unfilteredWords 是如何声明的?
  • 在我的机器上工作。你的unfilteredWords 是什么样的?
  • 错误消息说 string [] 所以必须有一个字符串 array (不是列表)某处搞砸了(可能是 unfilteredWords)跨度>
  • 看看IDEONE demo。我希望它会有所帮助。

标签: regex f# functional-programming


【解决方案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"; ""|]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 2018-12-20
      • 1970-01-01
      相关资源
      最近更新 更多