javascript - 为什么此正则表达式不适用于德语单词?

标签 javascript jquery regex unicode

我试图用单词打断下面的句子并将它们包裹在 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/

相关文章:

javascript - 用于选择所有文本节点的 XPath

php - 克隆 div 并逐步重命名元素 ID

jquery - 强制选择 jQuery-ui-tab 作为默认选项

javascript - 获取正则表达式中的第六个匹配行

javascript - 如何用空字符串替换 '.'

javascript - 如何将美化类 prettyprint 更改为我们喜欢的其他类名?

javascript - 可靠地隐藏 Bootstrap 模态

javascript - Google Chrome 扩展程序中的 getSelection.getRangeAt(0)

java - 如何在Java中使用正则表达式分割特殊字符

javascript - 检查一个类是否存在于一组选定元素中