用正则表达式拆分并替换javascript中的unicode单词
需要将unicode字符串中的unicode单词列表放入{}。 这是我的代码:用正则表达式拆分并替换javascript中的unicode单词,javascript,regex,unicode,split,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}')); 它返回: ?{1};{1}{1}{2
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}'));
它返回:
?{1};{1}{1}{2}{2}{2}{2}{tw}{tw}öu{3};;{tw}ä;{föur}
但应该是:
?{1};{one}oneé{two two}{two}{twöu}{three};;twä;{föur}
我做错了什么?首先,除非正则表达式是动态的,否则请使用
/…/gi
符号
它返回错误值的问题是,Javascript中的\W
实际上只是[^0-9a-zA-Z]
。像é
这样的重音字符不被视为单词字符。您需要手动排除它们
var re = /(^|[^a-zäéö])(one|tw|two two|two|twöu|three|föur)(?=[^a-zäéö]|$)/gi;
试试这个:
var txt = "¿One;one oneé two two two two two twö twöu three;;twä;föur?";
var re = new RegExp("(^|\\W)(one|two two|two|twöu|three|föur)(?=[^a-zé]|$)", "gi");
alert(txt.replace(re, '$1 {$2}'));
让我知道万一不行 问题
我做错了什么
不幸的是,答案是你没有做错什么。Javascript是
问题在于,Javascript不支持Unicode标准中规定的代码。
然而,有一个相当不错的图书馆叫做,它有一个非常有用的。我推荐它,尽管有几个值得注意的警告。你需要知道它能做什么,不能做什么
它做什么
- 纠正Javascript实现中不一致的各种错误,包括
- 支持从2012年1月起6.1版Unicode字符数据库中包含的BMP代码点
- 根据标准,正确地忽略Unicode属性名中的大小写、空格、连字符、负号和下划线,甚至Java都会出错
- 支持Unicode常规类别,如字母的
,货币符号的\p{L}
\p{Sc}
- 支持标准的完整属性名,如
的\p{Letter}
和\p{L}
的\p{Currency\u Symbol}
\p{Sc}
- 支持Unicode脚本属性,如
、\p{Latin}
和\p{希腊语}
\p{Common}
- 支持Unicode块属性,如
和\p{inbase\u Latin}
\p{inmathematic\u Alphanumeric\u Symbols}
- 支持1级法规遵从性所需的其他9个Unicode属性:
,\p{alphatic}
,\p{Uppercase}
,\p{Lowercase}
,\p{White\u Space}
,\p{Noncharacter code\u-code\u-Point}
,\p{Default Default Default Ignorable\u-code\u-code\u-Point}
,
- 支持命名捕获,而不只是编号捕获,使用标准符号执行此操作:
声明一个命名组,(?)?⋯)
按名称反向引用它,并在替换模式中使用\k
(通常在代码中使用${name}
访问它)。这与Perl 5.10、Java 7ᴇᴛ, 它使编写复杂的正则表达式变得容易得多,因为它允许你命名部分,而不是仅仅对它们进行编号,这样当你移动东西时,你就不必重新计算编号的变量result.name
- 支持
ᴀᴋᴀ <代码>(?s)模式,使点匹配任何单个代码点,而不是除换行符序列之外的任何东西。大多数其他正则表达式引擎支持此模式/s
- 支持
ᴀᴋᴀ <代码>(?x)模式,以便忽略空白和注释(如果未设置scape)。大多数正则表达式引擎支持此模式。它对于创建清晰的模式(因此是可维护的模式)是绝对必要的/x
- 即使不在
模式下使用标准/x
(?)也支持嵌入注释#⋯)代码>表示法(如Perl中所示)。这允许您将注释放在单个正则表达式片段中,而无需一直到
模式,这在开发更复杂的模式时非常重要,因为它允许您逐段构建它们/x
- 支持扩展性,因此您可以根据需要添加新的令牌类型,例如
以表示警报字符或POSIXish字符类\a
- 不支持完全Unicode,但仅支持平面0中的代码点。这是一个禁止的限制,因为Unicode标准要求正则表达式中的astral和非astral代码点之间没有区别。即使是Java在JDK7之前也不支持完全Unicode。(然而,v2.1.0开发版本确实支持完全Unicode。)
- 不支持用于grapheme群集的
,或用于换行符序列的\X
\R
- 不支持由两部分组成的属性,如
,\p{GC=Letter}
,\p{Block=speechonic\u Extensions}
,\p{Script=green}
,\p{Bidi\u Class=Right\u to\u Left}
,以及\p{Word Break=A\u Letter}
\p{Numeric\u Value=10}/code>
- 它不更新字符类快捷方式以根据的要求进行操作。标准JavaScript只允许
匹配Unicode\s
属性;不允许\p{White\u Space}
匹配\d
(尽管某些旧浏览器无论如何都会这样做!),也不允许\p{Nd}
匹配\w
,更不用说提供支持Unicode正则表达式的Unicode版本了,所有这些都是支持Unicode正则表达式的要求的一部分[\p{Alphabic}\pM\p{Nd}\p{Pc}]
- 它不支持一些常用属性。在实践中,缺少的是
,可能还有相当有用的\p{digit}
,\p{Dash}
,\p{Math}
,和\p{Diacritic}
属性\p{quote\u Mark}
- 不支持grapheme集群,例如使用
或甚至通过\X
此(?:\p{grapheme\u Base}\p{grapheme\u Extend}*)