Regex 用Perl标记逗号
请解释来自的这两行PerlRegex 用Perl标记逗号,regex,perl,Regex,Perl,请解释来自的这两行Perl 用␠,␠ 将所有逗号后跟不具有“数字”Unicode常规类别的字符替换为␠,␠ 嗯,不完全是。由于逗号本身是一个非数字字符,上述内容无法准确描述当一行中有两个逗号时发生的情况 但是它不值得太详细地讨论,因为由于A,B变成A,所以它工作得不好␠␠,␠␠B 标记器: my @tokens; for ($text) { if (/\G ( (?: [^,\d]++ | \d(?:,\d++)*+ )++ ) /xgc) { push @tokens, [
␠,␠代码>
␠,␠代码>
A,B
变成A,所以它工作得不好␠␠,␠␠B
标记器:
my @tokens;
for ($text) {
if (/\G ( (?: [^,\d]++ | \d(?:,\d++)*+ )++ ) /xgc) {
push @tokens, [ TEXT => $1 ];
redo;
}
if (/\G , /xgc) {
push @tokens, [ 'COMMA' ];
redo;
}
if (/\G \z /xgc) {
push @tokens, [ 'EOF' ];
last;
}
die("Internal error\n");
}
您的代码进行了两次替换。
s//
是一个替换,而/g
标志告诉它全局执行,本质上就是全部替换
这两行都使用正则表达式中的。使用IsN
检查字符是否为数字
/
( # capture group
[ # character group
^ # not the following characters
\p{IsN} # all characters that are a number
]
)
[,] # followed by a comma
/
它用捕获的not数字、空格、逗号和空格来替换
第二行也一样,但第一行用逗号
您可以使用相同的功能将此代码改写为更短、更简洁的代码。\P{}
是所有不具有此属性的字符,这样就不需要[]
。这可以进一步缩短为\PN
$text =~ s/(\PN),/$1 , /g;
$text =~ s/,(\PN)/ , $1/g;
\p{IsN}
⇒ <代码>\pN,所以[^\p{IsN}]
⇒ \PN
。\p{IsN}
和\d+
之间的区别是什么?@Flying\u whale,对于初学者来说,\PN
aka\p{IsN}
aka\p{General\u Category}
只匹配一个代码点。@Flying\u whale,\d
相当于\p{>{General_Category:Decimal_Number}
,\pN
的子集是十进制数字。\pN
包括328个以上的数字码点,但不是十进制数字(例如¼,㉑, 等)谢谢!是的,他们会在这个单一阶段所属的源文件的其余部分中处理随之而来的冗余间距。鉴于对问题和标题的编辑,再也不可能在这两个问题中真实地选择一个正确的答案。再次感谢这两个答案!:-)我看不出编辑是如何影响这一点的?仅此而已y整理了不必要的废话,留下了你的问题。
$text =~ s/(\PN),/$1 , /g;
$text =~ s/,(\PN)/ , $1/g;