在 Elixir 中,如何使用非单词字符拆分字符串作为分隔符,同时允许 +、- 等数学运算符?

In Elixir, how can I split a string with non-word characters are separators, but also allow for math operators like +, -, etc.?

在 Elixir 中,我想拆分一个字符串,将所有非单词字符视为分隔符,包括“Ogham Space Mark ( )”(不应与减号混淆(- ) 符号)。

所以,如果我拆分字符串:

"1\x002\x013\n4\r5 6\t7 + asda - 3434"

结果应该是:

["1","2","3","4","5","6","7","+","asda","-","3434"]

我正在尝试弄清楚如何使用 Regex 执行此操作,但到目前为止我能完成的最好的是:

Regex.split(~r/[\W| ]+/, input_string)

...但是这会删除 +- 符号,因为它们不被视为单词字符。

Regex.split(~r/[^[:punct:]|^[:alnum:]| ]+/, input_string)

但这无法在 Ogham Space 标记上拆分。

这实际上可以正常工作,但对于额外的转换来说并不优雅:

Regex.split(~r/[^[:punct:]|^[:alnum:]]+/, String.replace(input_string, " ", " "))

有没有办法通过单个 Regex 调用来拆分它?

Elixir 正则表达式由 PCRE 正则表达式引擎处理,您的输入字符串包含来自整个 Unicode 字符 table 的字符,而不仅仅是 ASCII 部分。

您可以在两个 PCRE 动词的帮助下启用 Unicode 模式,(*UTF)(*UCP):

Regex.split(~r/(*UTF)(*UCP)[^\w\/*+-]+/, "1\x002\x013\n4\r5 6\t7 + asda - 3434")

它将输出:

["1", "2", "3", "4", "5", "6", "7", "+", "asda", "-", "3434"]

参见Elixir demo online

注意~r/[^\w\/*+-]+/u~r/(*UTF)(*UCP)[^\w\/*+-]+/等价的u是shorthand 用于两个 PCRE 动词。

正则表达式匹配

  • (*UTF)(*UCP) - (*UTF) 将输入字符串视为 Unicode 代码点序列,并且 (*UCP) 使 \w 识别 Unicode(因此匹配 [\p{L}\p{N}_] 个字符)
  • [^\w\/*+-]+ - 除字母、数字、/*+-.
  • 以外的 1 个或多个字符

注意 - 字面意思 - char 放在字符 class.

末尾时不必转义