我读了一些匹配“ X,Y除外”的线程,但没有特定于perl6的线程。我正在尝试匹配和替换除以外的所有标点符号。和\“
gcc -Wall test.c $(apr-1-config --cflags --cppflags --includes --link-ld) -o test
什么是最好的方法?
非常感谢!!
llisprog
答案 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年为止,几乎没有对正则表达式引擎进行任何努力),这通常比使用真实字符类要慢。