草庐IT

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

coder 2024-05-10 原文

我试图用单词打断下面的句子并将它们包裹在 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 - 为什么此正则表达式不适用于德语单词?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  6. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  7. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  8. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  9. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  10. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

随机推荐