perl6正则表达式:匹配除之外的所有标点符号。和“

时间:2019-08-17 18:20:49

标签: regex character raku

我读了一些匹配“ X,Y除外”的线程,但没有特定于perl6的线程。我正在尝试匹配和替换除以外的所有标点符号。和\“

gcc -Wall test.c $(apr-1-config --cflags --cppflags --includes --link-ld) -o test

什么是最好的方法?

非常感谢!!

llisprog

1 个答案:

答案 0 :(得分:8)

我认为最自然的解决方案是使用“字符类算术表达式”。这需要在任意数量的Unicode properties+字符类上使用-[...]前缀:

                            #;# -+$12,678,93.45 "foo" *&
<+:punct -[."]>             #    +$12 678 93.45 "foo"

这可以理解为“具有Unicode属性punct减去."字符的字符类别”。


您的输入字符串包括+$。这些不被视为“标点符号”字符。您可以将它们显式添加到要用空格替换的字符集中:

<:punct +[+$] -[."] >       #      12 678 93.45 "foo"   

(我在+之前删除了首字母:punct。如果您没有为字符类算术表达式的第一项写+-则假定为+。)

有一个Unicode属性,它涵盖了所有“符号”,包括+$,因此您可以改用它:

<:punct +:symbol -[."] >    #      12 678 93.45 "foo"

回顾一下,您可以组合任意数量的

  • :punct开头并与Unicode指定的某些字符属性相对应的Unicode属性,例如:

  • [...]字符类,枚举特定字符,反斜杠字符类(例如\d)或字符范围(例如a..z)。


如果总体<...>断言是字符类算术表达式,则开头<之后的第一个字符必须是以下四个字符之一:

  • :引入了Unicode属性(例如<:punct ...>);

  • [引入了[...]字符类(例如<[abc ...>);

  • +-。后面可能跟空格。然后必须在其后跟随Unicode属性(:foo)或[...]字符类(例如<+ :punct ...>)。

此后,在同一总体字符类算术表达式中,每个其他属性或字符类都必须以+-开头,带有或不带有其他空格(例如<:punct - [."] ...>)。


您可以在括号中将子表达式分组。


我不确定+-的确切语义是什么。我注意到这个令人惊讶的结果:

say $a.subst(/<-[."] +:punct>/, " ", :g); # substitutes ALL characters!?! 

字符类算术表达式不接受

<...>形式的内置插件。

即使在文档中将它们称为“字符类”也是如此。其中包括字符类完全不同的字符(例如,<ident>在文档中被称为字符类,即使它与 multiple的字符串匹配字符串匹配特定模式!的字符),以及似乎像它们的字符也是字符类,例如<punct><digit>。 (其中许多后者直接对应于Unicode属性,因此您只需使用它们即可。)


要在使用\d+算术的字符类算术表达式中使用像-这样的反斜杠“字符类”,必须在 内列出{ {1}}字符类。

合并断言

虽然[...] 不能使用字符类算术与其他断言结合,但 可以使用& regex conjunction operator与其他正则表达式构造结合:

<punct>

根据编译器优化的状态(到2019年为止,几乎没有对正则表达式引擎进行任何努力),这通常比使用真实字符类要慢。