6

我想删除字符串中的所有字符,除了:

  • -_.
  • A直通Z
  • a直通z
  • 09
  • 空间

在 linux 命令行上,使用sed我会这样做:

$ echo "testing-#$% yes.no" | sed 's/[^-_.a-zA-Z0-9 ]//g'

输出:

testing- yes.no

如何使用 PARSE 在 Red 语言中实现相同的效果?我在看:

但是,我无法对其进行编码。我试过:

>> parse "mystring%^&" [#a - #z #A - #Z #0 - #9]
== false
>> parse "mystring%^&" [#a-#z#A-#Z#0-#9]        
== false
4

3 回答 3

6

首先注意ISSUE的区别!和CHAR!

#a #b #c  ; issues
#"a" #"b" #"c"   ; chars

然后,您可以为要保留的字符或要丢弃的字符建立一个字符集(BITSET!类型)。我们将在这里做前者:

good-chars: charset [#"a" - #"z" #"A" - #"Z" #"0" - #"9"]

现在我们有了它,我们可以通过一些不同的方式来解决这个问题:

解析

一个相当基本的解析循环——跳过任何good-chars并删除其他任何内容。

parse "mystring%^&" [any [some good-chars | remove skip]]

删除-每个

希望不言自明:

remove-each char "mystring%^&" [not find good-chars char]
于 2017-09-20T18:24:11.143 回答
4

首先,字符必须用引号括起来,#ais issue!char!is #"a"。你已经得到了正确的规范,但你必须将它传递给charset函数,以bitset!形成它。

然后你可以parse你的字符串,keep有效字符和skip无效:

>> chars: charset [#"a" - #"z" #"A" - #"Z" #"0" - #"9"]
== make bitset! #{000000000000FFC07FFFFFE07FFFFFE0}
>> rejoin parse "mystring%^&asdf" [collect some [keep chars | skip]]
== "mystringasdf"
于 2017-09-20T18:24:51.387 回答
2

另一种解决方案PARSE是在REPLACE此处使用:COMPLEMENT CHARSET

replace/all "mystring%^&" complement charset [{-_. } #"a" - #"z" #"0" - #"9"] {}

注意。以上作品在 Rebol (2 & 3)。不幸的是,它目前以红色挂起(在 MacOS 上测试 0.63)。

于 2017-09-21T16:03:00.177 回答