在Elixir中,如何使用非单词字符拆分字符串?它们是分隔符,但也允许使用+、-等数学运算符



在Elixir中,我想拆分一个字符串,将所有非单词字符视为分隔符,包括"Ogham空格标记()"(不应将其与减号(-(混淆(。

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

"1x002x013n4r5 6t7 + asda - 3434"

结果应该是:

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

我正在尝试找出如何使用Regex做到这一点,但到目前为止我能做到的最好的是:

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

但由于CCD_ 1和CCD_。

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

但这并没有在奥格姆太空标记上分裂。

这实际上是正确的,但对于额外的转换来说是不雅的:

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

有没有任何方法可以通过一个Regex调用将其拆分?

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

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

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

它将输出:

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

在线观看Elixir演示。

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

正则表达式与匹配

  • (*UTF)(*UCP)-(*UTF)将输入字符串视为Unicode码点序列,(*UCP)使+0具有Unicode意识(因此与[p{L}p{N}_]字符匹配(
  • [^w/*+-]+-除字母、数字、/*+-之外的1个或多个字符

注意,当放在字符类的末尾时,字面意义上的-字符的-不必转义。

最新更新