代码之家  ›  专栏  ›  技术社区  ›  Rakesh Juyal

为什么这个regex不适用于德语单词?

  •  12
  • Rakesh Juyal  · 技术社区  · 14 年前

    我试着用词把下面的句子打断,然后用广度把它们包装起来。

    <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>
    

    8 回复  |  直到 8 年前
        1
  •  10
  •   kijin    14 年前

    \w 仅匹配A-Z、A-Z、0-9和u(下划线)。

    你可以用一些像 \S+

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

        2
  •  26
  •   tchrist    14 年前

    与Java本身一样,Javascript在其 \w , \d \b regex快捷方式。这(可以说)是Java和Javascript中的一个bug。即使一个人设法通过漫不经心或固执来辩称 一只虫子,肯定是个大麻烦。有点咬,真的。

    只有 适用于7位ASCII,无论是Java还是Javascript。这种限制是痛苦的1970年代;在21世纪是完全没有意义的。这个 blog posting

    可能是 真的很好 如果某个有公益精神的人愿意将Javascript添加到 this Wikipedia page 它比较了各种语言中的支持regex特性。

    page 说Javascript根本不支持任何Unicode属性。同一个网站 a table 这比我上面提到的维基百科页面要详细得多。有关Javascript特性,请查看其ECMA列。

    其他语言中的Unicode支持

    Ruby、Python、Perl和PCRE都提供了扩展 \西 意思是什么 想象上的 意思是,但这两个孩子没有。

    然而,在Java中 \pL 表示具有Unicode General_Category=Letter属性的任何字符。这意味着你可以模仿 \西 使用 [\pL\p{Nd}_]

    事实上,这样编写它甚至有一个好处,因为这样可以让您意识到您正在向character类中添加十进制数字和下划线字符。用一个简单的 \西 ,请有时忘记这件事。

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

    \pN \p{Lu} 块属性如下 \p{InAncientSymbols} \p{IsGreek} 等等。

    \p{WhiteSpace} 或者是像 \p{Dash} \p{Quotation_Mark} .

    唉! 要了解Java的属性支持有多有限,只需将其与Perl进行比较。Perl支持2007年5.10版的1633个Unicode属性,今年5.12版的2478个。我还没有把它们算在古代版本中,但是Perl早在上个千年就开始支持Unicode属性了。

    尽管Java很蹩脚,但它仍然比Javascript好,因为Javascript不支持任何Unicode属性whatso 永远。恐怕是这样 Javascript's paltry 7-bit mindset 使它几乎无法用于Unicode。这是语言中一个巨大的漏洞,考虑到它的目标域,很难解释。

    对不起。

        3
  •  10
  •   XViD    14 年前

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

    而不是

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

    为了处理变音

        4
  •  10
  •   hqx5    10 年前

    全部的 拉丁语1补充了如下字符:

    [\w\u00C0-\u00ff]
    

    [\w\u00C0-\u024f]
    
        5
  •  6
  •   Wooble    14 年前

    \w \b 在javascript中不支持unicode;它们只匹配ASCII单词/边界字符。如果用例都允许在空白处拆分,则可以使用 \s \S ,它可以识别unicode。

        6
  •  2
  •   annakata    14 年前

    Ref1 ) ( Ref2 )在适当的范围内。

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

        7
  •  1
  •   Dave    13 年前

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

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

        8
  •  0
  •   Joan-Diego Rodriguez    10 年前

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