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

时间:2010-10-28 13:21:06

标签: 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。为什么会这样?什么是正确的正则表达式?

8 个答案:

答案 0 :(得分:26)

Javascript Regexen中的Unicode

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

问题是那些流行的正则表达式快捷方式适用于7位ASCII,无论是Java还是Javascript。 20世纪70年代,这种限制是痛苦的。它在21世纪完全没有意义。今年三月的这个blog posting为解决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属性的任何字符。这意味着您始终可以使用\w模拟正确的[\pL\p{Nd}_]

实际上,以这种方式编写它甚至有一个优势,因为它让你意识到你正在为字符类添加十进制数字和下划线字符。有了简单的\w,有时候会忘记这种情况。

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

当前Java支持的唯一Unicode属性是单字符和双字符常规属性,如\pN\p{Lu}以及块属性,如\p{InAncientSymbols},但不是像{{1}这样的脚本等等。

未来的JDK7最终将开始添加脚本。尽管如此,Java仍然不支持大多数Unicode属性,甚至不是\p{IsGreek}之类的关键属性或\p{WhiteSpace}\p{Dash}等方便的属性。

SIGH! 要了解Java的属性支持有多受限,只需将其与Perl进行比较即可。截至2007年的5.10版本,Perl支持1633个Unicode属性,截至今年的5.12版本,它支持2478个。我没有把它们算作古代版本,但Perl在上一个千年期间开始支持Unicode属性。

Lame作为Java,它仍然比Javascript好,因为Javascript不支持任何Unicode属性,而且 CENSORED 。我担心Javascript's paltry 7-bit mindset使得它几乎无法用于Unicode。鉴于其目标领域,这是一个非常巨大的漏洞,非常难以解释。

抱歉,那个。 ☹

答案 1 :(得分:10)

\w仅匹配A-Z,a-z,0-9和_(下划线)。

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

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

答案 2 :(得分:10)

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

[\w\u00C0-\u00ff]

然而,拉丁语Extended-A和Latin Extended-B unicode块中有更多有趣的字符,如ČŇů。要包括您可以使用:

[\w\u00C0-\u024f]

答案 3 :(得分:9)

您也可以使用

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

而不是

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

为了处理变音符号

答案 4 :(得分:6)

\w\b在javascript中不支持unicode;它们只匹配ASCII字/边界字符。如果您使用案例将允许在空格上进行拆分,则可以使用\s / \S,这是可识别unicode的。

答案 5 :(得分:2)

正如其他人所说,\ w快捷方式对非拉丁字符集不是很有用。如果您需要匹配其他文本范围,则应使用hex *表示法(Ref1)(Ref2)作为适当的范围。

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

答案 6 :(得分:1)

\ b也无法正常工作。可以使用Xregex库\ p {L}标签来支持unicode,但是仍然没有\ b支持,所以你将无法找到单词边界。通过在以下实现中使用\ P {L}执行lookbehind / lookaheads来提供\ b支持会很不错

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

答案 7 :(得分:0)

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