PHP正则表达式和JavaScript正则表达式有什么区别?

16

我正在处理正则表达式,我的正则表达式是 /\[([^]\s]+).([^]]+)\]/g 在PHP中对于 [http://sdgdssd.com fghdfhdhhd] 很好用,但当我在JavaScript中使用这个正则表达式时,它与这个输入字符串不匹配。

我的输入是 [http://sdgdssd.com fghdfhdhhd]


1
你确定你的语句是正确的吗?我想在JS中/\[([^]\s]+).([^]]+)\]/g可能有效,但在PHP中可能不行;PHP有不同于JS的修饰符。g不是PHP的修饰符。 - chris85
这适用于PHP,您可以通过在https://regex101.com上执行来检查它。 - Junaid
1
regex101不是PHP解释器,它只是一个正则表达式测试工具。请参考https://eval.in/481587和http://php.net/manual/en/reference.pcre.pattern.modifiers.php。虽然该正则表达式有效,但在PHP中使用该修饰符时无法正常工作。PHP函数已经是全局的,或者有一个函数可以使其成为全局的(preg_match_all vs. preg_match)。 - chris85
2个回答

13

在 JavaScript 的正则表达式中,你必须始终转义字符类内部的]

\[([^\]\s]+).([^\]]+)\]

请查看正则表达式演示

JS将[^]解析为正则表达式中的任何字符(包括换行符),并且最终的字符类]被视为字面量]

在这方面,JS正则表达式引擎与POSIX标准不同,后者使用智能定位来匹配带有方括号表达式的[]符号,例如[^][]

如果]^后面的第一个字符,则它被视为字面字符:[^]abc]

JS和Ruby中,情况并非如此:

您可以通过将未转义的闭合括号放在开头括号之后或否定符号(^)之后来包含未转义的闭合括号。 []x]匹配一个右方括号或x[^]x]匹配任何不是右方括号或x的字符。这在JavaScript中不起作用,因为它将[]视为始终无法匹配的为空字符类,而[^]视为否定的空字符类,可以匹配任何单个字符。 Ruby将空字符类视为错误。 因此,JavaScript和Ruby都要求使用反斜杠对关闭括号进行转义,以将其包含为字符类中的字面值。

相关信息:


3
在 PCRE 中似乎不需要转义],这很奇怪。我一直出于本能地进行转义,因为我认为如果不这样做,它会被卡住。 - chris85
@chris85: 我刚刚编辑了答案,因为我进行了双重检查,并发现在JS中不需要在字符类中转义[ - Wiktor Stribiżew
增加了一些关于这个问题的说明。 - Wiktor Stribiżew

2
我想补充一点关于将 PHP 的 preg_replace 正则表达式翻译成 JavaScript 的 .replace 正则表达式的小技巧:
<?php preg_replace("/([^0-9\,\.\-])/i";"";"-1 220 025.47 $"); ?>
Result : "-1220025.47"

使用PHP时,必须在正则表达式周围使用引号"...",使用点逗号将正则表达式与替换分隔开,并使用括号作为重复搜索的标志(这与完全不同的含义)。

<script>"-1 220 025.47 $".replace(/[^0-9\,\.\-]/ig,"") </script>
Result : "-1220025.47"

使用JavaScript时,正则表达式周围不需要引号,用逗号分隔正则表达式和替换内容,并且必须使用/g选项来表示多次搜索,除了/i选项之外(这就是为什么要用/ig)。
我希望这对某些人有用!请注意,在类似于"1,000.00 $"(英语?)的数字中,"\,"可能会被省略。
<script>"-1,220,025.47 $".replace(/[^0-9\.\-]/ig,"")</script>
<?php preg_replace("/([^0-9\.\-])/i";"";"-1,220,025.47 $"); ?>
Result : "-1220025.47"

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