[regex] 正則表達式匹配埃及象形文字


Answers

Unicode編碼埃及象形文字 ,範圍從U + 13000 - U + 1342F(超出基本多語文平面)。

在這種情況下,有兩種方法來編寫正則表達式:

  1. 通過指定U + 13000 - U + 1342F的字符範圍。

    雖然在正則表達式中為BMP中的字符指定字符範圍與[az]一樣容易,但取決於語言支持,這樣做對於星體中的字符可能並不那麼簡單。

  2. 通過為埃及象形文字指定Unicode塊

    由於我們匹配埃及象形文字塊中的任何字符 ,因此這是編寫支持可用的正則表達式的首選方式。

Java的

(目前,我不知道Java Class Libraries的其他實現如何處理Pattern類中的星體平面字符)。

Sun / Oracle實施

我不確定在Java 1.4中談論星體平面中的匹配字符是否合理,因為只能通過改進現有的String實現(它使用UCS-2的內部字符串表示形式)來在Java 5中添加BMP以外的字符支持)與代碼點感知方法。

由於Java繼續允許單獨的代理(不能與其他代理構成配對的代理)在String中指定,所以導致混亂,因為代理不是真正的字符,並且UTF-16中的單獨代理無效。

Pattern類看到了從Java 1.4.x到Java 5的一次重大改變,因為該類被重寫以提供對星體平面中匹配Unicode字符的支持:模式字符串在解析之前轉換為一個代碼點數組,並且輸入字符串被String類中的代碼點感知方法遍歷。

你可以在tchist的這個答案中閱讀更多有關Java正則表達式中的瘋狂的內容。

我已經寫了一個關於如何匹配一個涉及這個答案中的星體字符範圍的詳細解釋,所以我只在這裡包含代碼。 它還包括一些不正確的嘗試寫正則表達式來匹配星體平面字符的反例。

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}"

自1.4開始,Java支持Unicode塊的\p語法,但僅在Java 7中添加了對埃及象形文字塊的支持。

PCRE(用於PHP)

PHP示例已經在georg的答案中涵蓋了:

'~\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

字符範圍方法(這是在vanilla JavaScript中執行此操作的唯一方法)已在georg的答案中進行了介紹 。 正則表達式被修改了一點以覆蓋整個塊,包括保留的未分配的代碼點。

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

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

JavaScript也遭受與Java相同的字符串表示問題。 雖然Java在Java 5中修復了Pattern類以允許它與代碼點一起工作,但JavaScript RegExp在UCS-2的時代仍然停滯不前,迫使我們在正則表達式中使用代碼單元而不是代碼點。

ES6

這將很快改變。 如果一切順利,可能會在ECMAScript 6中添加對代碼點匹配的支持,ECMAScript 6可通過u標誌提供,以防止破壞以前版本ECMAScript中的現有實現。

查看上面第二個鏈接的Support部分,查看為ES6 RegExp提供實驗性支持的瀏覽器列表。

通過在ES6中引入\u{h...hh}語法,字符範圍可以用類似於Java 7的方式重寫:

/[\u{13000}-\u{1342F}]/u

或者,您也可以直接在RegExp文字中指定字符,但意圖不像[az]那樣清晰:

/[𓀀-𓐯]/u

注意上面兩個正則表達式中的u修飾符。

仍然陷入了ES5? 別擔心,您可以使用regxpu將ES6 Unicode RegExp轉換為ES5 RegExp。

Question

我想知道一個匹配埃及象形文字的正則表達式。 我完全無能,需要你的幫助。

因為堆棧溢出似乎無法識別它,所以我無法發布這些字母。

所以任何人都可以讓我知道這些角色的unicode範圍。




Related