Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用正则表达式拆分并替换javascript中的unicode单词_Javascript_Regex_Unicode_Split - Fatal编程技术网

用正则表达式拆分并替换javascript中的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

需要将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}{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}
    (通常在代码中使用
    result.name
    访问它)。这与Perl 5.10、Java 7ᴇᴛ, 它使编写复杂的正则表达式变得容易得多,因为它允许你命名部分,而不是仅仅对它们进行编号,这样当你移动东西时,你就不必重新计算编号的变量
  • 支持
    /s
    ᴀᴋᴀ <代码>(?s)
    模式,使点匹配任何单个代码点,而不是除换行符序列之外的任何东西。大多数其他正则表达式引擎支持此模式
  • 支持
    /x
    ᴀᴋᴀ <代码>(?x)模式,以便忽略空白和注释(如果未设置scape)。大多数正则表达式引擎支持此模式。它对于创建清晰的模式(因此是可维护的模式)是绝对必要的
  • 即使不在
    /x
    模式下使用标准
    (?)也支持嵌入注释#⋯)表示法(如Perl中所示)。这允许您将注释放在单个正则表达式片段中,而无需一直到
    /x
    模式,这在开发更复杂的模式时非常重要,因为它允许您逐段构建它们
  • 支持扩展性,因此您可以根据需要添加新的令牌类型,例如
    \a
    以表示警报字符或POSIXish字符类
它没有什么 但是,对于它所做的而不是所做的事情,您应该小心:

  • 不支持完全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只允许
    \s
    匹配Unicode
    \p{White\u Space}
    属性;不允许
    \d
    匹配
    \p{Nd}
    (尽管某些旧浏览器无论如何都会这样做!),也不允许
    \w
    匹配
    [\p{Alphabic}\pM\p{Nd}\p{Pc}]
    ,更不用说提供支持Unicode正则表达式的Unicode版本了,所有这些都是支持Unicode正则表达式的要求的一部分
  • 它不支持一些常用属性。在实践中,缺少的是
    \p{digit}
    ,可能还有相当有用的
    \p{Dash}
    \p{Math}
    \p{Diacritic}
    ,和
    \p{quote\u Mark}
    属性
  • 不支持grapheme集群,例如使用
    \X
    或甚至通过
    (?:\p{grapheme\u Base}\p{grapheme\u Extend}*)