使用正则表达式拆分和替换 javascript 中的 unicode 单词

2024-04-03

需要将 unicode 单词列表放入 {} 中的 unicode 字符串中。 有我的代码:

var txt = "¿One;one oneé two two two two two twö twöu three;;twä;föur?";
var re = new RegExp("(^|\\W)(one|tw|two two|two|twöu|three|föur)(?=\\W|$)", "gi");
alert(txt.replace(re, '$1 {$2}'));

它返回:

¿{一};{一} {一}é {二二} {二二} {二} {tw}ö {tw}öu {三};;{tw}ä;{föur}?

但应该是:

¿{一};{一} oneé {二二} {二二} {二} twö {twöu} {三};;twä;{föur}?

我做错了什么?


问题

我究竟做错了什么?

不幸的是,答案是你正在做nothing错误的。 JavaScript 是。

问题是Javascript不支持Unicode 正则表达式 http://www.unicode.org/reports/tr18/如此详细地阐述在统一码标准。

然而,有一个相当不错的库,名为XRegExp http://xregexp.com/其中有一个JavaScript 插件 http://xregexp.com/plugins/这有很大帮助。我推荐它,尽管有几个值得注意的警告。你需要知道它是什么can做什么,以及做什么cannot.


它能做什么

  • 纠正了 Javascript 实现中不一致的各种错误,包括its split功能 http://xregexp.com/cross_browser/.
  • 支持 2012 年 1 月起 Unicode 字符数据库 6.1 版本所涵盖的 BMP 代码点。
  • 正确忽略 Unicode 属性名称中的大小写、空格、连字符和下划线标准——甚至 Java 也会出错。
  • 支持 Unicode 常规类别,例如\p{L}对于字母和\p{Sc}对于货币符号。
  • 支持标准的完整属性名称,例如\p{Letter} for \p{L} and \p{Currency_Symbol} for \p{Sc}.
  • 支持 Unicode 脚本属性,例如\p{Latin}, \p{Greek}, and \p{Common}.
  • 支持 Unicode 块属性,例如\p{InBasic_Latin} and \p{InMathematical_Alphanumeric_Symbols}.
  • 支持 1 级合规性所需的其他 9 个 Unicode 属性:\p{Alphabetic}, \p{Uppercase}, \p{Lowercase}, \p{White_Space}, \p{Noncharacter_Code_Point}, \p{Default_Ignorable_Code_Point}, \p{Any}, \p{ASCII}, and \p{Assigned}.
  • 支持命名捕获,而不仅仅是编号捕获,使用标准符号来执行此操作:(?<NAME>⋯)声明一个命名组,\k<NAME>按名称反向引用它,然后使用${NAME}在替换模式中(并且通常使用result.NAME在你的代码中)。这与 Perl 5.10、Java 7、.ɴᴇᴛ 和其他几种语言使用的语法相同。它允许您命名各个部分而不是仅仅对它们进行编号,从而使编写复杂的正则表达式变得更加容易,这样当您移动内容时就不必重新计算编号的变量。
  • 支持/s ᴀᴋᴀ (?s)模式,以便点匹配任何单个代码点,而不是除换行序列之外的任何内容。大多数其他正则表达式引擎都支持此模式。
  • 支持/x ᴀᴋᴀ (?x)模式,以便忽略空格和注释(如果未转义)。大多数正则表达式引擎都支持此模式。对于创建清晰且可维护的模式来说,它绝对是必不可少的。
  • 即使不在中也支持嵌入注释/x使用标准模式(?#⋯)这样做的符号(例如在 Perl 中看到的)。这使您可以将注释放入各个正则表达式片段中,而无需一路/x模式,这对于开发更复杂的模式通常很重要,因为它允许您分段构建它们。
  • 支持可扩展性,以便您可以根据需要添加新的令牌类型,例如\a表示 ALERT 字符或 POSIXish 字符类。

它不做什么

但是,您应该小心它所做的事情not do:

  • 不支持完整的 Unicode,但仅支持 Plane 0 中的代码点。这是一个禁止的限制,因为统一码标准要求正则表达式中的星体代码点和非星体代码点之间没有区别。甚至 Java 直到 JDK7 才实现这一点。 (但是,v2.1.0开发版本确实支持完整的Unicode。)
  • 不支持\X对于字素簇,或者\R用于换行序列。
  • 不支持两部分属性,例如\p{GC=Letter}, \p{Block=Phonetic_Extensions}, \p{Script=Greek}, \p{Bidi_Class=Right_to_Left}, \p{Word_Break=A_Letter}, and \p{Numeric_Value=10}.
  • 它不会更新字符类快捷方式来根据要求进行操作UTS#18 http://www.unicode.org/reports/tr18/#Compatibility_Properties。标准 JavaScript 只允许\s以匹配 Unicode\p{White_Space}财产;它不允许\d匹配\p{Nd}(尽管有些旧的浏览器无论如何都会这样做!)也不\w匹配[\p{Alphabetic}\pM\p{Nd}\p{Pc}],更不用说提供 Unicode 感知版本了\b and \B,所有这些都是支持 Unicode 正则表达式的要求的一部分。
  • 它不支持一些常用的属性。实际上,缺少的是\p{digit},也许还有相当有用的\p{Dash}, \p{Math}, \p{Diacritic}, and \p{Quotation_Mark}特性。
  • 不支持字素簇,例如使用\X甚至通过(?:\p{Grapheme_Base}\p{Grapheme_Extend}*). 这确实是一件大事。

解决方法

这里有一些解决方法来处理图书馆不遵循的一些地方统一码标准:

  • 对于失踪者\w, 您可以使用[\p{L}\p{Nl}\p{Nd}\p{M}\p{InEnclosedAlphanumerics}]。它仅夸大了所附数字中的问题,因为它们并非如此\p{Nd}- 键入数字,这是唯一算作字母数字的数字。
  • 对于失踪者\W,因此你可以使用前一个的集补,所以[^\p{L}\p{Nl}\p{Nd}\p{M}\p{InEnclosedAlphanumerics}]。它仅夸大了所附数字中的问题。
  • Since \b确实是一样的(?:(?<=\w)(?!\w)|(?<!\w)(?=\w)), you could插上那个\w定义到该序列中以创建 Unicode 感知版本\b——前提是 JavaScript 支持所有四个方向的环视,而当我上次检查时,它不支持。你have为了正确地做到这一点,要同时进行积极和消极的后视,而不仅仅是前视。Javascript 忽略支持那些,至少据我所知。
  • Since \B确实是一样的(?:(?<=\w)(?=\w)|(?<!\w)(?!\w)),您可以做同样的事情,但要遵守相同的条件。
  • 对于失踪者\X,你可以通过使用来接近\P{M}\p{M}*,但是这错误地分割了 CRLF 结构并允许在相同的结构上进行标记,所有这些都是非常错误的。
  • 对于失踪者\R,您可以使用构建解决方法(?:\r\n|[\n-\r\u0085\u2028\u2029]).

Summary

结论是 JavaScript 的正则表达式完全不适合 Unicode 工作。然而,XRegExp 插件 http://xregexp.com/plugins/距离实现这一目标又近了一步。如果您可以忍受它的限制,这可能比切换到其他但支持 Unicode 的编程语言更容易。这当然比根本无法使用 Unicode 正则表达式要好。

然而,距离满足标准中规定的 Unicode 正则表达式最基本的要求(1 级支持)还有相当长的路要走。有一天,您将希望能够匹配字符,无论它们是否带有重音符号,或者在数学字母数字符号块中设置,或者使用 Unicode 大小写映射和大小写折叠定义,或者遵循统一码标准用于字母数字排序或断行和断词,以及你不能做anyJavascript 中的那些东西即使使用插件。

所以你可能希望考虑使用一种语言is符合统一码标准如果你确实需要处理 Unicode。 JavaScript 根本无法做到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用正则表达式拆分和替换 javascript 中的 unicode 单词 的相关文章

  • Javascript DOM setAttribute 在函数调用中不起作用

    我有一个带有输入元素的 HTML 文件 我希望向其中添加一个名为 valid fieldset011 的新属性 该属性用作 AngularJS 验证器的链接 输入元素具有属性 id fieldset011 如果我使用以下脚本 包含在脚本标签
  • Javascript - 在加载所有图像后执行

    看了别人的问题我想 window onload 会回答我的问题 我已经尝试过这个 但它会在页面加载时立即执行代码 而不是在图像加载之后 如果有什么区别的话 图像来自 CDN 并且不是相对的 有人知道解决办法吗 我没有使用 jQuery 想要
  • 限制可选 DOM 复选框

    我试图限制用户可以选择的复选框数量 这些复选框是为数组中的每个项目生成的 DOM 输入对象 我目前对此没有运气 因此非常感谢任何帮助 谢谢 在这里小提琴 http jsfiddle net vVxM2 222 http jsfiddle n
  • 为什么 length 是 `Array` 的属性而不是 `Array.prototype` 链

    所以我在 V8 控制台上玩了很多 我做到了 Object getOwnPropertyNames 我期望得到 结果 然而 length 所以这意味着不是成为原型链的一部分 length是所有人的成员财产Array对象 这是一个错误 还是有任
  • 启用/禁用由用户输入确定的复选框

    我有一个简单的表单 用户可以在其中输入他的联系号码 如果联系号码以 07 开头 则该复选框已启用 其他我需要禁用它的复选框 我已经编写了一些代码 但我面临的问题是 当用户键入 01 时 它会被禁用 但如果他们继续在 01 之后添加任何其他数
  • 判断一个数字是否能被 3 或 5 整除 (FizzBu​​zz)

    如何根据输出是否能被 3 或 5 整除来更改输出 如果它能被 3 整除 我想显示 rock 如果它能被 5 整除 我想显示 star 类似于 FizzBu zz 如果两者都有 他们都会看到 这是我的代码 if var n Math floo
  • 为什么将 x 和 y 设置为 0 时 svg 文本会消失?

    我刚刚开始阅读有关svg我提出了以下问题 我正在创建一个简单的svg with a text里面如下图所示 从我的阅读中我了解到x and y of the text标签声明文本在标签内的位置svg space 为什么当我同时设置x and
  • 在 Fabric.js 中按宽度/高度在另一个画布对象内居中和缩放画布对象

    Goal 将一个对象 水平和垂直 置于另一个对象 矩形或组 的中心canvas via Fabric js或者通过Javascript保持原始对象的长宽比相同 但也不超过父对象的宽度 高度比例 父对象 矩形或组 不会居中于canvas元素
  • 如何检测元素内容何时发生变化

    我正在寻找一种方法来监视元素内动态填充 无页面重新加载 内容 以便我可以将类添加到另一个元素 到目前为止我有这个 HTML div class message container div class messages error span
  • 如何使用 vanilla JS 实现可维护的反应式 UI

    今天我遇到了一个问题 可以通过使用像 Vue 这样的反应式和状态管理框架来轻松解决 遗憾的是 无法使用它 以下 简化 情况 链接到代码笔 https codepen io theiaz pen BazErKV 我们有一个服务器渲染的页面 其
  • 计算文本选择的 xy 位置

    我正在尝试使用 DOM 元素创建自己的文本选择 是的 我的意思是当您在此元素中选择文本时 您会在文本后面看到蓝色背景 这个想法是停止默认行为 蓝色 并使用我自己的元素来完成工作 方法是找到选择的 xy 位置 然后放置绝对定位的元素 我希望能
  • 尝试在 React 应用程序中连接到 MySQL 数据库时,无法读取未定义的属性(读取“查询”)错误

    我正在尝试连接到 MySQL 数据库并在单击按钮后在 React 应用程序中运行查询 一些它如何给出错误 我当前的代码如下所示 import mysql from mysql function App async function sync
  • RoR - Rails 中的大文件上传

    我有一个 Rails Web 应用程序 允许用户上传视频 视频存储在 NFS 安装的目录中 当前的设置适用于较小的文件 但我也需要支持大文件上传 最多 4GB 当我尝试上传 4GB 文件时 它最终会发生 但从用户体验的角度来看很糟糕 上传开
  • mozilla pdf.js 没有全视图

    我喜欢这个 pdf 查看器https github com mozilla pdf js https github com mozilla pdf js Demo http mozilla github com pdf js web vie
  • Node.js - 重载函数

    有没有一种方法可以重载node js中的函数 类似于 noSuchMethod https developer mozilla org en JavaScript Reference Global Objects Object noSuch
  • 强制输入数字小数位

    我想强制
  • Flowtype 属性“msg”缺失为 null 或未定义

    我发现 Flow 很难用 我明白那个Array find可以返回或未定义 因此 通过阅读以下内容 github Array find on Array 引发 https github com facebook flow issues 351
  • Internet Explorer 9 是否会因数组和对象文字末尾的额外逗号而卡住?

    现代浏览器和 Node js 等环境允许您说 a 1 b 2 或 1 2 3 这在历史上一直是 Internet Explorer 的问题 Internet Explorer 9 中修复了此问题吗 对此有两种不同的答案 一种是对象初始值设定
  • 从输入类型编号获取无效值

    我正在使用输入类型数字 当它无效时 我如何从中获取值 例如 使用类型编号并仅打印 e 这本身是无效的 我正在使用 React 但我认为这个问题非常普遍 onChange event console log event target valu
  • 无法使用 HTML 设置未定义 jQuery UI 自动完成的属性“_renderItem”

    我使用以下代码将 jQuery UI 自动完成项呈现为 HTML 这些项目在自动完成控件中正确呈现 但我不断收到此 JavaScript 错误并且无法移动过去 Firefox 无法转换 JavaScript 参数 Chrome 无法设置未定

随机推荐