我试图用单词打断下面的句子并将它们包裹在 span 中。
<p class="german_p big">Das ist ein schönes Armband</p>
我遵循了这个: How to get a word under cursor using JavaScript?
$('p').each(function() {
var $this = $(this);
$this.html($this.text().replace(/\b(\w+)\b/g, "<span>$1</span>"));
});
我面临的唯一问题是,将单词包装在 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>
因此,schönes 分为三个词 sch、ö 和 nes。为什么会这样?正确的正则表达式可能是什么?
最佳答案
Javascript 正则表达式中的 Unicode
与 Java 本身一样,Javascript 在其 \w
、\d
和 \b
正则表达式快捷方式中不支持 Unicode。这是(可以说)Java 和 Javascript 中的错误。即使有人通过诡辩或顽固来争辩说它不是 错误,但它肯定是一个大问题。有点咬人,真的。
问题是那些流行的正则表达式快捷方式仅适用于 7 位 ASCII,无论是在 Java 还是在 Javascript 中。这种限制是令人痛苦的 20 世纪 70 年代风格;这在 21ˢᵗ 世纪完全没有意义。这blog posting从今年 3 月开始,为在 Javascript 中解决这个问题提供了一个很好的论据。
如果有热心公益的人请将 Javascript 添加到 this Wikipedia page,那将非常好比较各种语言的支持正则表达式功能。
这page说 Javascript 根本不支持任何 Unicode 属性。同一个站点有 a table这比我上面提到的维基百科页面详细得多。对于 Javascript 特性,请查看其 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}
以及 block 属性,如 \p{InAncientSymbols}
,但不是像 \p{IsGreek}
等脚本
future 的 JDK7 终于可以加入脚本了。即使那样,Java 仍然不支持大多数 Unicode 属性,即使是像 \p{WhiteSpace}
这样的关键属性或像 \p{Dash}
和\p{Quotation_Mark}
。
SIGH! 要了解 Java 的属性支持有多么有限,只需将它与 Perl 进行比较即可。截至 2007 年的 5.10 版本,Perl 支持 1633 个 Unicode 属性,而截至今年的 5.12 版本,Perl 支持其中的 2478 个。我没有计算它们的古老版本,但 Perl 在上个千年开始支持 Unicode 属性。
虽然 Java 很蹩脚,但它仍然比 Javascript 好,因为 Javascript 不支持任何 Unicode 属性,所以已删除。恐怕Javascript's paltry 7-bit mindset使其几乎无法用于 Unicode。这是该语言中的一个巨大的漏洞,在给定其目标域的情况下极难解释。
对不起。 ☹
关于javascript - 为什么此正则表达式不适用于德语单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4043307/