为什么这个正则表达式不适用于德语单词?

我试图用语言打破下面的句子并将它们包裹在span中。

Das ist ein schönes Armband

我遵循这个: 如何使用JavaScript获取光标下的单词?

 $('p').each(function() { var $this = $(this); $this.html($this.text().replace(/\b(\w+)\b/g, "$1")); }); 

我面临的唯一问题是,在包含span中的单词之后,生成的html是这样的:

 

Das ist ein schönes Armband.

所以,schönes分为三个词sch,ö和nes。 为什么会这样? 什么是正确的正则表达式?

\w仅匹配AZ,az,0-9和_(下划线)。

你可以使用类似\S+东西来匹配所有非空格字符,包括像ö这样的非ASCII字符。 这可能会也可能不会起作用,具体取决于字符串的其余部分的格式。

参考: http : //www.javascriptkit.com/javatutors/redev2.shtml

Javascript Regexen中的Unicode

与Java本身一样,Javascript在其\w\d\b regex快捷方式中不支持Unicode。 这(可以说)是Java和Javascript中的一个错误。 即使一个人通过讽刺或固执来管理这不是一个错误,它肯定是一个大问题。 有点咬,真的。

问题是那些流行的正则表达式快捷方式适用于7位ASCII,无论是Java还是Javascript。 20世纪70年代,这种限制令人痛苦。 它在21世纪完全没有意义。 从今年三月开始的这篇博客文章为在Javascript中修复此问题提供了一个很好的论据。

如果一些公益精神的人愿意在这个维基百科页面中添加Javascript来比较各种语言的支持正则表达式function,那将是非常好的

该页面说Javascript根本不支持任何Unicode属性。 同一个网站的表格比我上面提到的维基百科页面要详细得多。 对于Javascriptfunction,请查看其ECMA列。

但是,该表在某些情况下至少已过期五年,因此我无法完全保证它。 不过,这是一个好的开始。

其他语言的Unicode支持

Ruby,Python,Perl和PCRE都提供了扩展\w以表示它应该意味着什么的方法,但是这两个J-thingies没有。

但是,在Java中,有一个很好的解决方法。 在那里,您可以使用\pL表示具有Unicode General_Category = Letter属性的任何字符。 这意味着您始终可以使用[\pL\p{Nd}_]模拟正确的\w

实际上,以这种方式编写它甚至是一个优势,因为它让你意识到你正在为字符类添加十进制数字和下划线字符。 有了简单的\w ,有时候会忘记这是怎么回事。

我不相信这种解决方法在Javascript中可用。 您还可以使用Perl和PCRE以及Ruby 1.9中的Unicode属性,但不能使用Python。

当前Java支持的唯一Unicode属性是单字符和双字符的常规属性,如\pN\p{Lu}以及块属性,如\p{InAncientSymbols} ,但不是像\p{IsGreek}等脚本。

未来的JDK7最终将开始添加脚本。 即使这样,Java仍然不支持大多数Unicode属性,但是,甚至不是像\p{WhiteSpace}这样的关键属性,也不是像\p{Dash}\p{Quotation_Mark}这样的方便的属性。

叹! 要了解Java的属性支持有多受限,只需将其与Perl进行比较即可。 截至2007年的5.10版本,Perl支持1633个Unicode属性,截至今年的5.12版本,它支持2478个。 我没有把它们算作古代版本,但Perl在上一个千年期间开始支持Unicode属性。

作为Java的Lame,它仍然比Javascript更好,因为Javascript不支持任何CENSORED的Unicode属性。 我担心Javascript的微不足道的7位思维模式使得它几乎无法用于Unicode。 鉴于其目标领域,这是一个非常巨大的漏洞,非常难以解释。

抱歉’回合那个。 ☹

要包含所有拉丁语1补充字符,例如äöüßÒÿ,您可以使用:

 [\w\u00C0-\u00ff] 

然而,在拉丁语扩展-A和拉丁语扩展-B unicode块中有更多有趣的字符,如ČŇů。 要包括你可以使用:

 [\w\u00C0-\u024f] 

你也可以使用

 /\b([äöüÄÖÜß\w]+)\b/g 

代替

 /\b(\w+)\b/g 

为了处理变音符号

\w\b在javascript中不是unicode-aware; 它们只匹配ASCII字/边界字符。 如果你使用的情况都允许在空格上拆分,你可以使用\s / \S ,它们是unicode-aware。

正如其他人所说,\ w快捷方式对非拉丁字符集不是很有用。 如果需要匹配其他文本范围,则应使用hex *表示法( Ref1 )( Ref2 )作为适当的范围。

* 可以是hex或八进制或unicode,您经常会看到这些统称为hex表示法

\ b也无法正常工作。 可以使用Xregex库\ p {L}标记来支持unicode,但是仍然没有\ b支持,因此您将无法找到单词边界。 通过在以下实现中使用\ P {L}执行lookbehind / lookaheads来提供\ b支持会很不错

http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

虽然javascript本身不支持Unicode,但您可以使用此库来解决它: http : //xregexp.com/