正则/^[a-z]+$/只有 PHP 匹配换行符,这算是 PHP 的 bug 么

2019-06-21 09:21:52 +08:00
 alex8
# php 7.2.16
var_dump(preg_match("/^[a-z]+$/", "abc\n"));
#int(1)
 # javascript
var reg = /^[a-z]+$/;
console.log(reg.test("abc\n"));
# 打印的是 false
# java(jdk11)
System.out.println(Pattern.matches("^[a-z]+$", "abc\n"));
# 打印的是 false
4745 次点击
所在节点    PHP
33 条回复
zsdroid
2019-06-21 10:12:16 +08:00
/^[a-z]+$/D

php 正则用的是 Perl 兼容正则表达式

$ 结尾处默认忽略回车

加 D 就变成不忽略回车
golden0125
2019-06-21 10:15:26 +08:00
@no1xsyzy 你 @的 1 2 楼不也是说的单双引号的区别?

"你在说什么鬼,1 分钟的搜索引擎告诉我单引号下 \n 不是换行符。"

他说过单引号下 \n 是换行符?
alex8
2019-06-21 10:15:37 +08:00
@zsdroid
是的,应该是 PHP 中独有的正则特性
https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php
golden0125
2019-06-21 10:16:00 +08:00
@leo108 麻烦你看明白我的问题后再来杠
no1xsyzy
2019-06-21 10:18:48 +08:00
对了回到楼主的问题,看来不是 bug 是 feature ……
PCRE 这套正则就是这么设计的,as spec。参考:<https://php.net/manual/zh/reference.pcre.pattern.modifiers.php>
『默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。』
所以正确的做法是加修饰符 D,样例:
https://tio.run/##K8go@P/fxr4go4CroCgzr0ShLLEoPqU0t0CjoCg1PT43sSQ5Q0NJPy46UbcqVltFX0lHQSkxKVlJU9OaOA0uUB0xeWA99nb//wMA
no1xsyzy
2019-06-21 10:20:28 +08:00
@golden0125 看楼主标题 “只有 PHP 匹配换行符”。
而 #1#2 答非所问,要问个换行符相关的问题,结果回答是 “把换行符去掉就行了”。你觉得这是回答?
yuwangG
2019-06-21 10:20:34 +08:00
@zsdroid 是的,学习了~ thanks
golden0125
2019-06-21 10:26:01 +08:00
@no1xsyzy 我没看到他回答过 “把换行符去掉就行了” 他回答的很清楚,注意单双引号的区别
zarte
2019-06-21 10:30:36 +08:00
@zsdroid
终于等到一个解决的回复了。
yuwangG
2019-06-21 10:35:12 +08:00
@no1xsyzy 确实, 理解题目出现了偏差,尴尬~
no1xsyzy
2019-06-21 10:36:31 +08:00
@golden0125 把 "\n" 换成 '\n' 不是把换行符去掉?换成了 #\\ 和 #\n。
你说说 'abc\n' 里哪来的换行符?换成单引号哪里符合楼主的提问?
况且那个 "abc\n" 实际使用基本不会是字面量而是字符串变量( Pattern 是变量而待匹配字符串是常量的情况比较少,而且这种情况一般也不会产生换行结尾的),这种情况下你怎么改单引号?
没理了还强行杠?
dyllen
2019-06-21 13:53:00 +08:00
@sunweiqiang8 不是独有吧,php 的文档里面明确说明的 php 实现的正则是和 perl 一样的,那估计 perl 里面也是这样的。
alex8
2019-06-21 14:11:15 +08:00
@dyllen

修饰符 D 的描述最后一行:
There is no equivalent to this modifier in Perl
在 Perl 中没有与此修饰符等效的东西

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/576068

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX