【问题标题】:Regex modifier /u in JavaScript?JavaScript中的正则表达式修饰符/ u?
【发布时间】:2012-10-05 12:10:31
【问题描述】:

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

我怎样才能重写它,这样它也可以在 JavaScript 中工作?

有什么东西只允许使用波兰语字符:Ł, Ą, Ś, Ć, ...

【问题讨论】:

  • 也许this answer 在这里会有所帮助。
  • 您确定需要 u 标志吗?您是否尝试过删除它并测试表达式?
  • @cammil "u" 是必需的,因此 "\p{L}" 被识别为检查 UTF-8 字母。

标签: php javascript regex unicode


【解决方案1】:

JavaScript 没有任何 UTF-8 字符串的概念,因此您不太可能需要 /u 标志。 (您的字符串可能已经采用通常的 JavaScript 格式,每个“字符”一个 UTF-16 代码单元。)

更大的问题是 JavaScript 不支持\p{L},也不支持任何等价的符号; JavaScript 正则表达式不知道 Unicode 字符属性。请参阅this StackOverflow question 的答案,了解一些近似它的方法。


编辑补充:如果你只需要支持波兰字母,那么你可以写/^[\sa-zA-ZĄĆĘŁŃÓŚŹŻąćęłńóśźż]+$/a-zA-Z 部分覆盖 ASCII 字母,然后将其余字母单独列出。

【讨论】:

  • 坏消息...所以也许有些东西只允许使用这些波兰字符:ŁĄŚĆĘ
  • Scott,如果你有一小部分字符要允许,你总是可以使用字符类。
  • @Joey 是的,一般来说,我希望只允许我上面提到的那些特殊字符。
  • 在 Javascript 正则表达式中,您可以像这样引用 unicode 字符:\u0161。例如,这将只允许可打印的 ASCII 和 Ć: var newtxt = txt.replace(/[^\u0107\u0020-\u007e]/g, '') 。例如,您的字符的 Unicode 代码可以在这里找到:fileformat.info/info/unicode/char/107/index.htm
  • @DamirR:多么奇怪的评论。 /\u0107/ 等价于/Ć/;为什么你会更喜欢前者?
【解决方案2】:

/u 修饰符用于 unicode 支持。 在 ES2015 的 JavaScript 中添加了对它的支持。

阅读http://stackoverflow.com/questions/280712/javascript-unicode,了解更多关于使用 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]

【讨论】:

  • 有人可能会争辩说,在任何能够正确处理 Unicode 的语言/环境中都不需要修饰符,而不是像 PHP 这样的字符串中二进制数据和实际 Unicode 文本的混杂。
  • @Joey - 基于 PCRE 的 PHP preg 函数在将 /u 选项附加到正则表达式时支持 Unicode。
  • @Scott - 波兰语使用拉丁语,所以使用范围 [\u0000-\u007F] = 基本拉丁语; [\u0080-\u00FF] = 拉丁语 1 补充; [\u0100-\u017F] = 拉丁语扩展-A; [\u0180-\u024F] = 拉丁文扩展-B; ...它们一起使[\u0000-\u024F] 包含所有拉丁字符:)
  • Ωmega,我知道为什么在 PCRE 中需要标志,从根本上说问题是 PHP 没有为字符串定义的字符集,导致一些字符串在一些遗留字符集中,一些在UTF-8,有些甚至存储非文本二进制数据。鉴于文本始终是 Unicode,Java 或 .NET 等环境在这方面要容易得多。
  • 这个答案是谷歌搜索“regex u flag”时的第一个结果之一,所以你可能想用一个前言来更新它,说明它已经在 ES2016 中定义并且现在支持最近的浏览器:)
【解决方案3】:

【讨论】:

  • 目前并非所有浏览器都支持。
  • @PoulBak 它在the Mozilla docs 上说它受到所有主流浏览器的支持,除非他们弄错了。
  • 如果你使用 Edge 的某些版本,它会简单地崩溃,但我认为这已经修复,所以你可能是对的(不再使用 IE)。
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多