在Perl正则表达式中,\D代表匹配任何非数字字符。

8
在我维护的某些代码中,我发现了这个表达式:
$r->{DISPLAY} =~ s/\Device//s;

令我惊讶的是它同时匹配device和Device!
我在文档中没有发现\D的提及,只有\d。
可以有人澄清一下吗...

你几乎肯定想要一个不区分大小写的匹配(s/Device//si),而不是这个\D的混淆用法... - Wooble
1
还有一个有用的提示是,在命令行上运行 perldoc perlre,或者访问这里:http://perldoc.perl.org/perlre.html。 - FMc
2
我会称之为\D的"错误"用法,而不是"混淆"用法...那个正则表达式也会匹配"crevice", "Levice"甚至是"#evice",不仅仅只有"device"和"Device"。 - Dave Sherohman
阅读代码的其余部分(未显示),似乎需要与“Device”进行区分大小写的匹配。我认为这个杂项“\”是一个剪切和粘贴错误。感谢您的帮助 :-) - Roger
3个回答

19

\D\d 的否定,它匹配所有非数字字符。


2
@Roger 如果你喜欢sepp2k的回答,你应该点击左边的勾号,表示这个答案解决了你的问题。 - TLP
@Roger 如果你想勾选sepp2k的答案,我认为你犯了一个错误...你把勾选标记放在了我的答案上。 - TLP
@TLP:不要抱怨!你提供了更有帮助的答案,获得了采纳。这就是系统的运作方式。 - Donal Fellows

11

在那个正则表达式中,\D 看起来像是一个笔误。它之所以能匹配到 dD,仅仅因为它可以匹配任何非数字字符(0-9)。

如果意图是匹配 "device" 或 "Device",更合适的正则表达式应该是:

s/(d|D)evice// # one way
s/[dD]evice//  # another way

s选项也有点奇怪。来自perldoc perlop


s   Treat string as single line. (Make . match a newline)

而且在那行代码中并没有进行任何匹配。


是的,我认为 '' 是一个复制粘贴错误,因为需要与 Device 匹配... - Roger
奇怪的复制/粘贴错误...在我能想到的任何上下文中,它似乎都不属于那里,除了可能是来自Windows路径,例如"c:\Device"... - TLP

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接