我想知道一个正则表达式,以匹配埃及象形文字。我完全一无所知,需要您的帮助。
我无法发布字母,因为堆栈溢出似乎无法识别它。
任何人都可以让我知道这些字符的unicode范围。
Answers:
TLDNR: \p{Egyptian_Hieroglyphs}
Egypt_Hieroglyphs属于“星形”平面,该平面使用16个以上的位来编码字符。从ES5开始,JavaScript不支持星体平面(更多关于),因此您必须使用代理对。第一个代理人是
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>
这就是它的样子 安装Noto Sans埃及象形文字的:
在支持UCS-4的平台上,您可以直接使用埃及代码点13000
进行编码1342F
,但是语法因系统而异。例如,在Python(3.3或更高版本)中,它将是[\U00013000-\U0001342E]
:
>>> s = "some \U+13000 really \U+13001 old \U+1342C stuff \U+1342D \U+1342E"
>>> s
'some 𓀀 really 𓀁 old 𓐬 stuff 𓐭 𓐮'
>>> import re
>>> re.findall('[\U00013000-\U0001342E]', s)
['𓀀', '𓀁', '𓐬', '𓐭', '𓐮']
最后,如果您的正则表达式引擎支持unicode属性,则可以(并且应该)使用这些属性而不是硬编码范围。例如在php / pcre中:
$str = " some 𓀀 really 𓀁 old 𓐬 stuff 𓐭 𓐮";
preg_match_all('~\p{Egyptian_Hieroglyphs}~u', $str, $m);
print_r($m);
版画
[0] => Array
(
[0] => 𓀀
[1] => 𓀁
[2] => 𓐬
[3] => 𓐭
[4] => 𓐮
)
Unicode编码 范围从U + 13000 – U + 1342F(超出基本多语言平面)的埃及象形文字。
在这种情况下,有两种编写正则表达式的方法:
通过指定字符范围从U + 13000 – U + 1342F。
尽管[a-z]
根据语言支持,使用BMP中的字符在regex中指定字符范围很容易,但是对于星体平面中的字符来说,这样做并不那么简单。
通过为埃及象形文字指定Unicode块
由于我们匹配埃及象形文字块中的任何字符,因此这是在有支持的情况下编写正则表达式的首选方式。
(目前,我不知道Java类库的其他实现如何处理 Pattern
)。
我不确定在Java 1.4中谈论在星体平面上匹配字符是否有意义,因为Java 5中仅通过改造现有的String实现(使用UCS-2作为其内部String表示形式)来添加对BMP以外字符的支持。 )和代码点感知方法。
由于Java继续允许在String中指定单独的替代(不能与其他替代成对),因此,由于替代不是真正的字符,并且单独的替代在UTF-16中是无效的,因此导致混乱。
Pattern
从Java 1.4.x到Java 5,该类进行了重大改进,因为该类被重写以提供对在星体平面中匹配Unicode字符的支持:将模式字符串在解析之前转换为代码点数组,并输入字符串由String类中的代码点感知方法遍历。
您可以在tchist的答案中阅读有关Java regex疯狂的更多信息。
我已经写了一个详细的解释,说明如何在此答案中匹配涉及星体平面字符的一系列字符,因此我将仅在此处包括代码。它还包括一些错误尝试,这些尝试错误地尝试编写正则表达式以匹配星体平面字符。
"[\uD80C\uDC00-\uD80D\uDC2F]"
"[\\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 \p
从1.4开始就支持Unicode块的语法,但是仅在Java 7中添加了对埃及象形文字块的支持。
georg的答案已经涵盖了PHP示例:
'~\p{Egyptian_Hieroglyphs}~u'
请注意,u
如果要按代码点匹配而不是按代码单位匹配,则标志是必需的。
不知道在StackOverflow上是否有更好的文章,但是我u
在我的这个答案中写了一些关于标志效果的解释(UTF模式)。
需要注意的一点Egyptian_Hieroglyphs
是只能从PCRE 8.02(或不低于PCRE 7.90的版本)获得)获得。
或者,您可以使用以下\x{h...hh}
语法指定字符范围:
'~[\x{13000}-\x{1342F}]~u'
注意强制性 u
标志。
该\x{h...hh}
语法是由至少支持PCRE 4.50。
字符范围方法(这是在普通JavaScript中执行此操作的唯一方法)已在georg的答案中介绍。修改正则表达式以覆盖整个块,包括保留的未分配代码点。
/(?:\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F])/
上面的解决方案演示了在星体平面中匹配一系列字符的技术,以及JavaScript RegExp的局限性。
JavaScript还遭受与Java相同的字符串表示问题。尽管Java确实Pattern
在Java 5中修复了类以使其可以使用代码点,但是JavaScriptRegExp
仍然停留在UCS-2时代,这迫使我们使用代码单元而不是正则表达式中的代码点。
最后,在ECMAScript 6中添加了对代码点匹配的支持,该u
标志可通过标志使用,以防止破坏早期版本的ECMAScript中的现有实现。
在上面第二个链接中查看“支持”部分,以获取对ES6提供实验性支持的浏览器列表RegExp
。
通过\u{h...hh}
在ES6中引入语法,可以以类似于Java 7的方式重写字符范围:
/[\u{13000}-\u{1342F}]/u
或者,您也可以直接在文字中指定字符RegExp
,尽管意图并不像[a-z]
:
/[𓀀-𓐯]/u
注意 u
上面两个正则表达式中修饰符。
仍然陷在ES5中?别担心,你可以transpile ES6的Unicode正则表达式来ES5正则表达式与regxpu。