Elixir标点符号替换正则表达式

时间:2014-09-13 01:06:06

标签: regex elixir

我尝试使用

删除字符串中的所有标点符号
String.replace(sentence, ~r[\p{P}\p{S}], "")

然而,它并没有删除所有标点符号!作为一个说明性的例子:

iex(1)> String.replace("foo!&^%$?", ~r[\p{P}\p{S}], "")
"foo!?"

我应该使用什么?

3 个答案:

答案 0 :(得分:17)

可能需要/ ... /作为模式delimiters

String.replace("foo!&^%$?", ~r/[\p{P}\p{S}]/, "")

可以解释结果,因为其他[ ]将用作样本中的分隔符,对应于\p{P}\p{S}作为序列并生成foo!?(见regex101 example

还会添加+ quantifier~r/[\p{P}\p{S}]+/

答案 1 :(得分:0)

如果您仅使用英语字符串,则仅使用POSIX character classes最为简单明了:

String.replace("foo!&^%$?", ~r/[[:punct:]]/, "")

答案 2 :(得分:0)

我迟到了,但您必须调整正则表达式并对其进行自定义,尤其是在您尝试保留某些项目时,例如连字符(在某些语言方面被视为标点符号)。

我的替换有点冗长,但让我控制要替换的内容:

String.replace(str, ~r/[!#$%&()*+,.:;<=>?@\^_`{|}~-]/, "")

这让我可以将连字符保留在单词中,例如 co-operate,同时删除 : 或其他字符。