正则expression式匹配埃及象形文字
我想知道一个匹配埃及象形文字的正则expression式。 我完全无能为力,需要你的帮助。
我不能发布堆栈溢出似乎不能识别它的信件。
那么任何人都可以让我知道这些angular色的unicode范围。
TLDNR: \p{Egyptian_Hieroglyphs}
使用Javascript
埃及象形文字属于使用超过16位来编码字符的“星体”层面。 JavaScript,从ES5,不支持星体飞机( 更多的 ),因此你必须使用代理对。 第一个代理是
U+13000 = d80c dc00
最后一个是
U+1342E = d80d dc2e
给出
re = /(\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E])+/g t = document.getElementById("pyramid").innerHTML document.write("<h1>Found</h1>" + t.match(re))
<div id="pyramid"> some 𓀀 really 𓀁 old 𓐬 stuff 𓐭 𓐮 </div>
Unicode编码的埃及象形文字范围从U + 13000 – U + 1342F(超出基本多语文平面)。
在这种情况下,有两种方法来编写正则expression式:
-
通过指定从U + 13000 – U + 1342F的字符范围。
虽然在正则expression式中为BMP中的字符指定字符范围与
[az]
一样容易,但取决于语言支持,对于星体中的字符这样做可能并不那么简单。 -
通过为埃及象形文字指定Unicode块
因为我们在埃及象形文字块中匹配任何字符 ,所以这是编写支持可用的正则expression式的首选方法。
Java的
(目前,我还不知道Java Class Libraries的其他实现如何处理Pattern
类中的星体字符)。
Sun / Oracle实施
我不确定在Java 1.4中讨论星体平面上的匹配字符是否合理,因为对BMP以外的字符的支持只是在Java 5中通过改进现有的string实现(使用UCS-2的内部string表示)与代码点感知的方法。
由于Java继续允许在String中指定单独的替代项(不能与其他替代项成对),所以导致混乱,因为替代项不是真正的字符,在UTF-16中单个替代项是无效的。
Pattern
类看到了从Java 1.4.x到Java 5的一次重大改变,因为该类被重写以提供对星体平面中匹配Unicode字符的支持:模式string在被parsing之前被转换为一个代码点数组,并且inputstring被String类中的代码点感知方法遍历。
你可以在这个答案中阅读更多关于Java正则expression式的疯狂。
我已经写了一个关于如何匹配一个涉及这个答案中的星体字符范围的详细解释,所以我只在这里包括代码。 它还包括一些不正确的尝试写正则expression式来匹配星体平面字符的反例。
Java 5(及以上)
"[\uD80C\uDC00-\uD80D\uDC2F]"
Java 7(及以上)
"[\\uD80C\\uDC00-\\uD80D\\uDC2F]" "[\\x{13000}-\\x{1342F}]"
由于我们匹配属于Unicode块的任何代码点,因此它也可以写为:
"\\p{InEgyptian_Hieroglyphs}" "\\p{InEgyptian Hieroglyphs}" "\\p{InEgyptianHieroglyphs}" "\\p{block=EgyptianHieroglyphs}" "\\p{blk=Egyptian Hieroglyphs}"
Java支持从1.4开始的Unicode块的\p
语法,但是仅支持Java 7中的埃及象形文字块。
PCRE(在PHP中使用)
PHP的例子已经在georg的答案中涵盖了:
'~\p{Egyptian_Hieroglyphs}~u'
请注意,如果要通过代码点进行匹配而不是通过代码单元进行匹配,则u
标志是强制性的。
不知道在StackOverflow上是否有更好的post,但是我在这个答案中写了一些关于u
标志(UTF模式)的效果的解释 。
有一点需要注意的是Egyptian_Hieroglyphs
象形文字只能从PCRE 8.02 (或者不早于PCRE 7.90的版本)中获得。
或者,您可以使用\x{h...hh}
语法指定一个字符范围:
'~[\x{13000}-\x{1342F}]~u'
注意强制性的u
标志。
至lessPCRE 4.50支持\x{h...hh}
语法。
JavaScript(ECMAScript)
ES5
georg的答案已经涵盖了字符范围方法(这是在vanilla JavaScript中完成的唯一方法)。 正则expression式被修改了一点以覆盖整个块,包括保留的未分配的代码点。
/(?:\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F])/
上面的解决scheme演示了在星体平面上匹配一系列字符的技巧,以及JavaScript RegExp的局限性。
JavaScript也遭受与Java相同的string表示问题。 尽pipeJava在Java 5中修复了Pattern
类以允许它与代码点一起工作,但是JavaScript RegExp
在UCS-2的时代仍然停滞不前,迫使我们使用代码单元而不是正则expression式中的代码点。
ES6
这将很快改变。 如果一切顺利,可能会在ECMAScript 6中添加对代码点匹配的支持,ECMAScript 6通过u
标志提供,以防止破坏以前版本的ECMAScript中的现有实现。
- ES6草案 – 21.2 RegExp(正则expression式)对象
- ECMAScript 6中支持Unicode的正则expression式
查看上面第二个链接的支持部分,查看为ES6 RegExp
提供实验性支持的浏览器列表。
通过在ES6中引入\u{h...hh}
语法,字符范围可以用类似于Java 7的方式重写:
/[\u{13000}-\u{1342F}]/u
或者,您也可以直接在RegExp
文字中指定字符,尽pipe意图不像[az]
那样清晰:
/[𓀀-𓐯]/u
注意上面两个正则expression式中的u
修饰符。
仍然陷入了ES5? 别担心,您可以使用regxpu将ES6 Unicode RegExp转换为ES5 RegExp。