程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 集思廣義支持中文的正則表達式庫

集思廣義支持中文的正則表達式庫

編輯:關於C++

初衷——我想說的

大家好!

我所知道的正則表達式庫有:boost的,GNU的,VC7帶的ATL中的和微軟發布的greta。我使用過後三種,greta使用時間最短(才兩天)。

現在我來說說我的感受

GNU的正則表達式根本就不支持多字節碼,設置連UNICODE都不支持,在parse階段就會非法操作。在軟件全球化的今天,實在不是一個好現象。優點是支持的語法完備。

ATL中的正則表達式不完全支持多字節碼,可以完善的支持UNICODE。不過,此正則表達式書寫非常清晰,沒有用到STL裡面任何高深的東西,也沒有用到模板中特別高深的東西(我認為這才是C++的發展之道,畢竟,聰明人是少數——大部分是平庸的人,曲高寡合,總有一天會被大多數程序員拋棄,剩下一幫高手顧影自憐),所以,通過非常微小和容易的更改就可以完善支持多字節碼。缺點是不支持{n,m}語法,不支持遞歸語法,如:"([^\\"]*(\\.)*[^\\"]*)*"。最後一個*是不被支持的。

greta能完善的支持單字節碼和UNICODE,語法也完善,而且據說普遍情況下速度也快,不過,把部分實現放cpp裡導致不能同時使用單字節碼和UNICODE編碼,posix和perl語法,解決辦法還算簡單:把cpp改名為inl,在.h裡include這個inl,再修改一點別的東西就可。問題是,它沒有支持多字節碼的實現,我仔細看看了,似乎通過自己寫一個多字節碼的迭代子,可以解決這個問題,因為他支持basic_string。

接下來的問題是:STL如何支持多字節碼的?我沒有在SGI-STL,STLPort453中找到關於多字節碼的東西。basic_string默認只實現了char,wchar_t的base_string。而要自己實現一個迭代子,我又不知道如何下手。

我現在的需求是

需要正則表達式支持類似這樣的語法:

“/漢字[  ]+[^ , ,]+[  ]*[,,][  ]*[^ , ,]+”

以匹配“/漢字 蘭征鵬 ,正則表達式”。

使用STL進行字符串搜索都有問題,比如在一篇文章中搜索“正則”,很可能就把三個漢字的中間四個字節匹配上了。出現這樣的情況,讓人哭笑不得。

有這方面經驗的或對STL比較熟悉的同仁,請勿吝啬指導

禮!

lanzhengpeng

2004-06-02

_______________________________________________

Cpp mailing list

在C/C++中如果想要使用與Perl兼容的regexp庫,一個選擇是Boost,另一個選擇是PCRE庫。Boost中的regex算法最近做了改近,平均效率比以前的版本提高了10倍,不過用起來可能比較麻煩。PCRE已經很成熟了,Apache/Postfix/PHP/Python都用它。我認為應該優先考慮。不過我自己沒有在Windows下編譯過,不是很有把握。

See www.pcre.org

我個人很喜歡Ruby中的正則表達式功能,功能強,速度也很不錯。因為Ruby是日本人發明的,處理東亞大字符集沒有任何問題。Ruby與C/C++接口很容易,但是為了這個小功能加入Ruby,似乎有點小題大做了。Perl我不熟悉。Lua獨創了一套模式匹配語法,而且Lua天生就是要嵌入到C/C++中去的,性能比Perl/Ruby/Python都快的多。Lua的模式匹配語法有點怪,解決lanzhengpeng的問題好像是足夠的,不過跟標准regex語法完全不同。

我個人的感覺,不如靜下心來寫一個iterator,應該是很容易的。不過我也很久沒干過這種事情了,也就泛泛的說說算了。

孟巖

_______________________________________________

Cpp mailing list

發件人: kyo

發送

[一人之斷制, 所見有限, 猶目之一瞥, 豈能盡萬物之情乎]

_______________________________________________

Cpp mailing list

關於C++漢字查找的問題最近大話西游也遇到,因為要限制經濟頻道裡的說話必須包含“賣”。要精確判斷的話,需要先把char*或string的字符串先用MultiByteToWideChar轉為 WCHAR或wstring, 然後再查找。這樣只能判斷有和無,實際上我需要精確位置。

是可以精確查找的呀。

另外是否可以嵌入其他東西:我覺得沒有必要,實際那些腳本語言最後也通過C/C++來做的,搞不好還就是用的我們已知的東西。而且正則表達式如此有用,以至於我到處都在使用——無論程序大小。如果為此在那些眾多的程序中嵌入一個腳本,也是我所不願意的。

_______________________________________________

Cpp mailing list

kyo,您好!

關於C++漢字查找的問題最近大話西游也遇到,因為要限制經濟頻道裡的說話必須包含“賣”。要精確判斷的話,需要先把char*或string的字符串先用MultiByteToWideChar轉為 WCHAR或wstring, 然後再查找。這樣只能判斷有和無,實際上我需要精確位置。

另外是否可以嵌入其他東西:我覺得沒有必要,實際那些腳本語言最後也通過C/C++來做的,搞不好還就是用的我們已知的東西。而且正則表達式如此有用,以至於我到處都在使用——無論程序大小。如果為此在那些眾多的程序中嵌入一個腳本,也是我所不願意的。

禮!

lanzhengpeng

2004-06-02

_______________________________________________

Cpp mailing list

Hello lanzhengpeng,

用什麼多字節,不但麻煩,效率又低,轉換成unicode再處理拉。

大家都這麼推薦,我著手做一下吧。多字及碼到UNICODE的位置影射也應該不難為什麼要轉成 unicode? 我覺得轉成雙字節就夠了多一步轉換干什麼?

Best regards,

cloudwu

[凡是有良好教養的人有一禁誡:勿發脾氣]

_____________________________________________

Analyst,您好!

用什麼多字節,不但麻煩,效率又低,轉換成unicode再處理拉。大家都這麼推薦,我著手做一下吧。多字及碼到UNICODE的位置影射也應該不難。

禮!

lanzhengpeng

2004-06-03

_______________________________________________

Cpp mailing list

kyo,您好!

關於C++漢字查找的問題最近大話西游也遇到,因為要限制經濟頻道裡的說話必須包含“賣”。要精確判斷的話,需要先把char*或string的字符串先用MultiByteToWideChar轉為 WCHAR或wstring, 然後再查找。這樣只能判斷有和無,實際上我需要精確位置。

是可以精確查找的呀。

我曾經做過一個小工具,提取並修改代碼中的文字部分,並將文字匯總到一個文件裡,需要本地化的時候,修改這個文件就可。比如:LANGUAGE(0,"我曾經做過一個小工具");正則表達式應該很容易抽取出0,並且將0替換成一個其他的數值(就是後面的字符在文件中排序的編號)。如果轉換過後,我怎麼知道原來的位置呢?

禮!

lanzhengpeng

2004-06-03

_______________________________________________

Cpp mailing list

大家好!

近日空閒了,著手寫個正則表達式解析的東西吧,不求速度,只求滿足我的要求。在我完成一定階段的編碼後,會交付源代碼給大家測試。

現在問幾個問題:

“^”作為匹配起始的時候:

一、在單行模式下(即全文中可以包含換行符號“\n”,但是“$”不匹配“\n”,而是匹配結束。同時,“.”可匹配“\n”),“^”可否寫在表達式的中間,如此必然沒有任何可匹配的東西。這個時候是否作為語法錯誤?

二、在多行模式下,“^”是作為匹配的起始地址還是說匹配“\n ”的後一個字符?我比較趨向於匹配起始地址

三、在多行模式下,“$”可否匹配匹配串的結束?還是只匹配“\n|\r\n”

四、“^$”是否作為語法錯誤處理?如果不作為語法錯誤,是匹配一個空串還是什麼都不匹配?

這些疑問,在各個正則表達式庫或各個工具(如VC,UEdit)都有不同的處理方案。

另外,我暫時沒有找到正則表達式詳細介紹的資料(如rfc或編譯原理的書籍),煩請哪位達人提供一份資料,中文最好,英語也可,其它語言不考慮。

_______________________________________________

Cpp mailing list

關於C++漢字查找的問題最近大話西游也遇到,因為要限制經濟頻道裡的說話必須包含“賣”。要精確判斷的話,需要先把char*或string的字符串先用MultiByteToWideChar轉為 WCHAR或wstring, 然後再查找。這樣只能判斷有和無,實際上我需要精確位置。

是可以精確查找的呀。

我曾經做過一個小工具,提取並修改代碼中的文字部分,並將文字匯總到一個文件裡,需要本地化的時候,修改這個文件就可。比如:LANGUAGE(0,"我曾經做過一個小工具");

正則表達式應該很容易抽取出0,並且將0替換成一個其他的數值(就是後面的字符在文件中排序的編號)。如果轉換過後,我怎麼知道原來的位置呢?

wchar 查找到位置後,然後把它逐個轉換為char不就知道了嘛,哈哈 :B

禮!

lanzhengpeng

2004-06-05

_______________________________________________

Cpp mailing list

我是初學者, 也來添亂:

一.在單行模式下^ $都只表述位置概念(開始, 結束), 而不匹配具體的任何字串,所以$當然不匹配"\n ", ^寫在中間是可以匹配的, 比如我寫 a?^b 或者是a{0}^b時, bcd是可以匹配的, 當然把開始位置的匹配寫到其他地方不是一個好習慣, 但是也許也不應該禁止吧?

二.多行模式下^匹配"\n"的下一個字符, 比如^\d 和abcd\n123匹配, 而$匹配"\n"的上一個字符, 比如is$ 和his\nhere匹配 。

三.不是很理解所說的, 應該是指is$是否和hr\nhis這樣的字串匹配吧? 答案是yes多行模式下使$輿行的末尾匹配(而不止是字符串的末尾), ^輿行的開始匹配(而不止是字符串的開始)

四.不應該判為非法, 單行模式下 ^$匹配"" 多行模式下匹配"aaa\n\naaa"(空行)只用egrep測試過^_^

書就有一本了, 來可欣這邊就可以看到啦...《regular expression》

_____________________________________________

Cpp mailing list

我想說的

我相信,這個世界上的正則表達式解析庫遠遠不止我知道的這些,但是,願意開源的就很少了。開源的庫其質量也是參差不齊,或著重點不同。特別引人注目的是,在所有這些已知的代碼庫中,沒有一個是中國程序員寫的。我希望打破這種局面,並且注重功能和支持多字節碼(不僅僅是東亞大字符集),速度是其次——因為我的功底不夠,對正則表達式不是非常熟悉,對有限自動機也沒有理解透徹。

如果你要說我這個正則表達式語法不正統,那麼,我會說你長得不像人——因為我才是標准的人樣。

請勿散播造車不必從輪子造起的論調,我有很多大道理,但我不願意寫。公司領導對這個開放代碼持有異議,不過,由於此代碼庫沒有用在公司任何項目上,並且我堅持在家裡完成代碼的編碼工作(這篇文章倒是在公司機器上寫的),因此,此代碼庫不存在其他的版權糾紛,

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved