2011-08-20 53 views
1

一些字符我有在一個unicode範圍排除來自正則表達式範圍

[\u0D80-\u0DFF]* 

我要排除的話,其包括例如\ u0D92某一字符選擇字的正則表達式。

我該如何改變表達式?

+0

其中正則表達式引擎/語言與Google合作? – aioobe

+0

我正在使用.Net Framework 4 – nima

回答

1

只需構建兩個範圍;也就是說,使差距在你的範圍要排除的值...

[\u0D80-\u0D91\u0D93-\u0DFF]* 
+1

如果這些字符的數量超過一個,該怎麼辦?有沒有辦法將它們乾淨地排除? – nima

+1

如果他有幾個「無效」字符,則不會非常優雅地縮放。 – aioobe

+0

@nima:我會假設這個正則表達式可以通過程序或腳本來構建,並且結果看起來並不是那麼重要,只要註釋就是這樣。 –

0

你能不能減去從一個字符類的字符由做

[\u0D80-\u0DFF&&[^\u0D92]]* 

[a-z&&[^egi]]比賽中的所有字符az,除了egi

+0

什麼反對你的回答,但什麼樣的正則表達式引擎支持'&&'語法? –

+0

[Java正則表達式引擎](http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html)。我不知道這是否是標準符號。 – aioobe

+0

我在http://regexpal.com/和.Net中測試過,沒有工作。 – nima

0

使用向前看符號來實現交集:

(?x)(?: 
    (?!\x{d92}) 
    [\x{d80}-\x{dff}] 
) 

這將創建一個適合你的標準的原子。有資格隨意。

我不相信您的\uXXXX表示法。當你看到某些使用它的東西時,它總是一個不好的跡象,因爲它是一些古老的Unicode 1遺留符號,它僅假設爲Plane 0。這意味着它自Unicode 2開始一直沒有用,可以追溯到前一個千年。如果可能的話,我會避免它,因爲你不想陷入不適合Unicode命名空間的16/17的壞習慣。

因此,我使用了Java 7,ICU和Perl中使用的標準\x{...}表示法,該表示法不針對Unicode的平面1-16。事實上,在用UTF-16表示法(是的,Java,我在看着你)中發現的語言中,這是執行非BMP範圍的唯一可能方式。

+0

感謝有關十六進制符號的信息。但我無法在.Net – nima

+0

@nima中得到這個工作:當然,如果你不使用自己的方言的十六進制轉義版本,你不能得到它的工作。關鍵是'\ uXXXX'本質上是有缺陷的。咄。你沒有語言標籤,所以你不應該期望什麼,你的作品。 – tchrist