正则表达式匹配埃及象形文字[关闭]


67

我想知道一个正则表达式,以匹配埃及象形文字。我完全一无所知,需要您的帮助。

我无法发布字母,因为堆栈溢出似乎无法识别它。

任何人都可以让我知道这些字符的unicode范围。


1
任何人都可以从充满编程知识的两个出色答案中看到,这显然是关于编程的!投票重新开放。
hippietrail

Answers:


38

TLDNR: \p{Egyptian_Hieroglyphs}

Java脚本

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] => 𓐮
    )

10

Unicode编码 范围从U + 13000 – U + 1342F(超出基本多语言平面)的埃及象形文字

在这种情况下,有两种编写正则表达式的方法:

  1. 通过指定字符范围从U + 13000 – U + 1342F。

    尽管[a-z]根据语言支持,使用BMP中的字符在regex中指定字符范围很容易,但是对于星体平面中的字符来说,这样做并不那么简单。

  2. 通过为埃及象形文字指定Unicode块

    由于我们匹配埃及象形文字块中的任何字符,因此这是在有支持的情况下编写正则表达式的首选方式。

爪哇

(目前,我不知道Java类库的其他实现如何处理 Pattern)。

Sun / Oracle实施

我不确定在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疯狂的更多信息。

我已经写了一个详细的解释,说明如何在此答案中匹配涉及星体平面字符的一系列字符,因此我将仅在此处包括代码。它还包括一些错误尝试,这些尝试错误地尝试编写正则表达式以匹配星体平面字符。

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 \p从1.4开始就支持Unicode块的语法,但是仅在Java 7中添加了对埃及象形文字块的支持。

PCRE(在PHP中使用)

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(ECMAScript)

ES5

字符范围方法(这是在普通JavaScript中执行此操作的唯一方法)已在georg的答案中介绍。修改正则表达式以覆盖整个块,包括保留的未分配代码点。

/(?:\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F])/

上面的解决方案演示了在星体平面中匹配一系列字符的技术,以及JavaScript RegExp的局限性。

JavaScript还遭受与Java相同的字符串表示问题。尽管Java确实Pattern在Java 5中修复了类以使其可以使用代码点,但是JavaScriptRegExp仍然停留在UCS-2时代,这迫使我们使用代码单元而不是正则表达式中的代码点。

ES6

最后,在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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.