我试图在单词中打破下面的句子并将它们包装在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。为什么会这样?什么是正确的正则表达式?
答案 0 :(得分:26)
与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列。
但是,该表在某些情况下至少已过期五年,因此我无法完全保证。不过,这是一个好的开始。
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字符。这可能会也可能不会起作用,具体取决于字符串的其余部分的格式。
答案 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/