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

Rak*_*yal 12 javascript regex unicode jquery

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

<p class="german_p big">Das ist ein schönes Armband</p>
Run Code Online (Sandbox Code Playgroud)

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

$('p').each(function() {
            var $this = $(this);
            $this.html($this.text().replace(/\b(\w+)\b/g, "<span>$1</span>"));
        });
Run Code Online (Sandbox Code Playgroud)

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

<p class="german_p big"><span>Das</span> <span>ist</span> <span>ein</span> <span>sch</span>ö<span>nes</span> <span>Armband</span>.</p>
Run Code Online (Sandbox Code Playgroud)

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

tch*_*ist 26

Javascript Regexen中的Unicode

像Java本身,JavaScript不支持Unicode它\w, \d\b正则表达式的快捷方式.这(可以说)是Java和Javascript中的一个错误.即使一个人通过诡辩或顽固来管理它不是一个错误,它肯定是一个大问题.有点咬,真的.

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

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

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

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

其他语言的Unicode支持

红宝石,Python和Perl和PCRE都提供办法延长\w意味着什么是应该的意思,但两人J-一样的东西没有.

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

实际上,以这种方式编写它甚至是一个优点,因为它让你意识到你正在为字符类添加十进制数字和下划线字符.有一个简单\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是,它仍然不是JavaScript更好,因为JavaScript不支持whatso任何Unicode属性删失过.我担心Javascript的微不足道的7位思维模式使得它几乎无法用于Unicode.鉴于其目标领域,这在语言中是一个非常巨大的漏洞,非常难以解释.

抱歉,那个.☹


kij*_*jin 10

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

您可以使用类似\S+匹配所有非空格字符的内容,包括ö等非ASCII字符.这可能会也可能不会起作用,具体取决于字符串的其余部分的格式.

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


小智 10

你也可以使用

/\b([äöüÄÖÜß\w]+)\b/g
Run Code Online (Sandbox Code Playgroud)

代替

/\b(\w+)\b/g
Run Code Online (Sandbox Code Playgroud)

为了处理变音符号


小智 10

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

[\w\u00C0-\u00ff]
Run Code Online (Sandbox Code Playgroud)

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

[\w\u00C0-\u024f]
Run Code Online (Sandbox Code Playgroud)


Woo*_*ble 6

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