在 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"]
注意:~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.
末尾时不必转义
在 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"]
注意:~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.