JavaScript中的正则表达式修饰符 /u 是什么?

23

最近我创建了一个正则表达式,用于我的PHP代码,它只允许字母(包括特殊字符和空格),但现在我遇到了将其转换为JavaScript兼容的正则表达式时出现的问题,这是它的代码:/^[\s\p{L}]+$/u,问题在于正则表达式模式末尾的/u修饰符,因为JavaScript不允许使用这样的标记。

我该如何重写它,以便在JavaScript中也能够工作?

是否有一些方法只允许波兰字符:Ł, Ą, Ś, Ć ...


3
或许这个答案对此有帮助。 - Lix
1
你确定需要使用u标志吗?你尝试过去掉它并测试表达式吗? - cammil
1
@cammil 需要使用 "u",这样 "\p{L}" 才能被识别为检查 UTF-8 字母。 - Matt S
3个回答

20

/u修饰符支持Unicode。在ES2015中添加了对其的支持。

阅读https://dev59.com/AnVC5IYBdhLWcg3weBE-以了解有关JavaScript中带有正则表达式的Unicode的更多信息。


波兰字符:

Ą \u0104
Ć \u0106
Ę \u0118
Ł \u0141
Ń \u0143
Ó \u00D3
Ś \u015A
Ź \u0179
Ż \u017B
ą \u0105
ć \u0107
ę \u0119
ł \u0142
ń \u0144
ó \u00F3
ś \u015B
ź \u017A
ż \u017C

所有的波兰特殊字符:

[\u0104\u0106\u0118\u0141\u0143\u00D3\u015A\u0179\u017B\u0105\u0107\u0119\u0142\u0144\u00F3\u015B\u017A\u017C]

1
有人可能会认为,在任何正确处理Unicode而不是在字符串中混杂二进制数据和实际Unicode文本的语言/环境中,修饰符都是不必要的,比如PHP。 - Joey
@Joey - PHP的preg函数基于PCRE,当在正则表达式后附加/u选项时,支持Unicode。 - Ωmega
@Scott - 波兰语使用拉丁字母,因此请使用范围[\u0000-\u007F]=基本拉丁文;[\u0080-\u00FF]=拉丁1补充;[\u0100-\u017F]=拉丁扩展-A;[\u0180-\u024F]=拉丁扩展-B;...这些范围一起得到[\u0000-\u024F]以包括所有拉丁字符 :) - Ωmega
1
Ωmega,我知道为什么在PCRE中需要标志,根本原因是PHP没有为字符串定义字符集,导致一些字符串处于某些遗留字符集中,一些处于UTF-8中,一些甚至存储非文本二进制数据。像Java或.NET这样的环境在这方面要容易得多,因为文本始终是Unicode。 - Joey
2
这个答案是在搜索“regex u flag”时谷歌的首要结果之一,因此您可能希望更新它,并加上一个前言说明它已经在ES2016中定义,并且现在被大多数最新的浏览器支持 :) - Aaron
@Ωmega 如果你只想匹配字母,你可以使用:[\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8] 但它看起来肯定不太整洁。 - Liggliluff

6
JavaScript没有任何UTF-8字符串的概念,因此您不太可能需要/u标志。(您的字符串可能已经以通常的JavaScript形式存在,即每个“字符”一个UTF-16代码单元。)
更大的问题是JavaScript不支持\p{L}或任何等效符号;JavaScript正则表达式不了解Unicode字符属性。请参见这个StackOverflow问题的答案,了解一些近似方法。
编辑添加:如果您只需要支持波兰字母,则可以编写/^[\sa-zA-ZĄĆĘŁŃÓŚŹŻąćęłńóśźż]+$/a-zA-Z部分涵盖ASCII字母,然后逐个列出剩余的字母。

坏消息...也许有什么方法只允许这些波兰字符:ŁĄŚĆĘ - Scott
Scott,如果你想允许一小组字符,你可以使用字符类。 - Joey
@Joey,通常我希望额外允许我上面提到的特殊字符。 - Scott
在Javascript正则表达式中,您可以像这样引用Unicode字符:\u0161。例如,这将仅允许可打印的ASCII和Ć: var newtxt = txt.replace(/[^\u0107\u0020-\u007e]/g, '')。 您的字符的Unicode代码可以在此处找到:http://www.fileformat.info/info/unicode/char/107/index.htm - DamirR
@DamirR:多么奇怪的评论。/\u0107/等同于/Ć/;你为什么要选择前者呢? - ruakh
1
@ruakh:生活充满了奇怪的时刻。 :) 为了让/Ć/正常工作,你必须将js文件保存为UTF-8格式。有时,其他人可能会使用、更改、保存你的代码,并且他们可能会使用其他编码(例如iso-8859-1)。因此,/Ć/将无法正确保存,脚本也将无法正常工作。如果你使用/\u0107/,这种错误就可以避免。 - DamirR

1

目前并非所有浏览器都支持此功能。 - Poul Bak
@PoulBak 根据Mozilla文档的说明,除非他们弄错了,否则所有主流浏览器都支持它。 - Futago-za Ryuu
一些版本的Edge会崩溃,如果你使用它,但我认为这已经被修复了,所以你可能是正确的(没有人再使用IE了)。 - Poul Bak

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