Joh*_*ohn 5 javascript regex unicode split
需要在{}中的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}'));
Run Code Online (Sandbox Code Playgroud)
它返回:
¿{One}; {one} {one}é{two two} {two two} {two} {tw}ö{tw}öu{three} ;; {tw}ä; {föur}?
但应该是:
¿{One}; {one}oneé{two two} {two two} {two}twö{twöu} {three} ;;twä; {föur}?
我做错了什么?
tch*_*ist 14
我究竟做错了什么?
不幸的是,答案是你没有做错任何事.Javascript是.
然而,有一个相当不错的库叫做XRegExp,它有一个JavaScript插件,可以提供很多帮助.我推荐它,尽管有一些值得注意的警告.你需要知道什么可以做,什么也不能.
split功能.\p{L}字母和\p{Sc}货币符号.\p{Letter}for \p{L}和\p{Currency_Symbol}for \p{Sc}.\p{Latin},\p{Greek}和\p{Common}.\p{InBasic_Latin}和\p{InMathematical_Alphanumeric_Symbols}.\p{Alphabetic},\p{Uppercase},\p{Lowercase},\p{White_Space},\p{Noncharacter_Code_Point},\p{Default_Ignorable_Code_Point},\p{Any},\p{ASCII},和\p{Assigned}.(?<NAME>?)声明命名组,\k<NAME>按名称对其进行反向,并${NAME}在替换模式中使用(通常result.NAME在代码中使用它).这与Perl 5.10,Java 7,.ɴᴇᴛ和其他几种语言使用的语法相同.通过让你为部件命名而不是仅对它们进行编号,它使复杂的正则表达式更容易编写,这样当你移动东西时就不必重新计算编号的变量了./sᴀᴋᴀ (?s)模式,使点匹配任何单个代码点,而不是除了换行序列之外的任何内容.大多数其他正则表达式引擎支持此模式./xᴀᴋᴀ (?x)模式,以便忽略空格和注释(如果未转义).大多数正则表达式引擎都支持此模式.它对于创造清晰易读 - 因此可维护 - 的模式是绝对必不可少的./x使用标准(?#?)符号的模式下也支持嵌入式注释(例如在Perl中看到).这使得您可以将注释放在单独的正则表达式中,而无需一直进入/x模式,这对于开发更复杂的模式通常很重要,允许您逐个构建它们.\a表示ALERT字符或POSIXish字符类.但是,对于它没有做的事情,你应该小心:
\X字形集群或\R换行序列.\p{GC=Letter},\p{Block=Phonetic_Extensions},\p{Script=Greek},\p{Bidi_Class=Right_to_Left},\p{Word_Break=A_Letter},和\p{Numeric_Value=10}.\s匹配Unicode \p{White_Space}属性; 它不允许\d匹配\p{Nd}(虽然有些旧的浏览器能做到这一点呢!),也不\w匹配[\p{Alphabetic}\pM\p{Nd}\p{Pc}],更不用说提供支持Unicode的版本\b和\B,所有这些都是支持Unicode的正则表达式的要求的一部分.\p{digit},或许也是相当有用的\p{Dash},\p{Math},\p{Diacritic},和 \p{Quotation_Mark}属性.\X甚至通过(?:\p{Grapheme_Base}\p{Grapheme_Extend}*).这是一个非常重要的事情.以下是处理库不遵循Unicode标准的一些地方的一些解决方法:
\w,您可以使用[\p{L}\p{Nl}\p{Nd}\p{M}\p{InEnclosedAlphanumerics}].它仅在附带的数字中夸大了事项,因为它们不是\p{Nd}类型数字,它们是唯一被认为是字母数字的数字.\W因此,对于缺失,您可以使用前一个的set-complement,所以[^\p{L}\p{Nl}\p{Nd}\p{M}\p{InEnclosedAlphanumerics}].它仅在附上的数字中夸大了事项.\b实际上是相同的(?:(?<=\w)(?!\w)|(?<!\w)(?=\w)),你可以将该\w定义插入该序列以创建一个支持Unicode的版本\b- 只要JavaScript支持所有四个方向的外观,当我最后检查时,它没有.为了做到这一点,你必须同时具有积极和消极的外观,而不仅仅是前瞻.Javascript忽略了支持这些,至少就我所见.\B实际上是相同的(?:(?<=\w)(?=\w)|(?<!\w)(?!\w)),你可以做同样的事情,但受相同的条件限制.\X,你可以通过使用得到sorta \P{M}\p{M}*,但是错误地拆分了CRLF结构并允许标记相同,所有这些都非常错误.\R,您可以构建一个使用的解决方法(?:\r\n|[\n-\r\u0085\u2028\u2029]).结论是JavaScript的正则表达式完全不适合Unicode工作.但是,XRegExp插件更接近于实现可行性.如果你能忍受它的限制,那么这可能比切换到另一种支持Unicode的编程语言更容易.它肯定比无法使用Unicode正则表达式更好.
但是,如果符合标准中规定的Unicode正则表达式的最基本要求(1级支持),它仍然是一个很长的路要走.总有一天你会想要能够匹配字符,无论它们是否有重音符号,或者在数学字母数字符号块中设置,或者使用Unicode案例映射和大小写折叠定义,或者跟随Unicode标准用于字母数字排序或用于行和断字,即使使用插件也无法在Javascript中执行任何操作.
因此,如果您确实需要处理Unicode ,则可能需要考虑使用符合Unicode标准的语言.Javascript只是不管理.
首先,除非正则表达式是动态的,否则请使用/.../gi表示法.
它返回错误值的问题是因为\W在Javascript中它真的是公正的[^0-9a-zA-Z_].重音字符é不被视为单词字符.您需要手动排除它们.
var re = /(^|[^a-zäéö])(one|tw|two two|two|twöu|three|föur)(?=[^a-zäéö]|$)/gi;
Run Code Online (Sandbox Code Playgroud)