Beyond the C++ Standard Library: An Introduction to Boost — Library 5.1 Regex

來源:互聯網
上載者:User
Library 5. RegexRegex庫如何改進你的程式?
  • 為C++帶來了對Regex的支援

  • 改進有效輸入的健壯性

在文本處理中常常會用到Regex。例如,有很多驗證有效性的工作適合使用Regex。考慮一個應用程式,它要求輸入只由數字組成。而另一個程式可能要求一種特殊的格式,如三個數字,後跟一個字母,再後跟兩個數字。你可能要驗證郵遞區號、信用卡號碼、社會保險號碼,或者其它東西;使用Regex來做這些驗證是很簡單的。另外一個可以使用Regex的地方是文本替換,即用某些文本替換掉另一些文本。假如你需要在很多文檔中將單詞colour 轉換為 color。Regex提供了最好的方法來做這個工作,包括同時記住替換 Colour 和 COLOUR, 以及複數形式的 colours, 動詞 colourize, 等等。還有一個可以使用Regex的地方就是,格式化文本。

許多流行的程式設計語言,Perl是其中一例,都內建了對Regex的支援,但在C++裡沒有。C++標準在提到Regex時也保持了沉默。Boost.Regex是一個非常完善並有效庫,它將Regex併入了C++程式,並且它包含了Perl, grep和Emacs等常見工具所使用的幾種不同文法。它是最著名的C++Regex庫之一,既容易使用又異常強大。

Regex 如何適用於標準庫?

目前的C++標準庫是不支援Regex的。這是令人遺憾的,有那麼多對Regex的需要,有時使用者為了編寫需要支援Regex的程式而不得不放棄使用C++。Boost.Regex填補了標準在這方面的空白,並且它已經被提議加入到下一個版本的C++標準中。Boost.Regex已經被即將到來的Library Technical Report所接受。

 

Regex

標頭檔: "boost/regex.hpp"

Regex被封裝為一個類型 basic_regex的對象。我們將在下一節更深入地討論Regex如何被編譯和分析,這裡我們首先粗略地看看 basic_regex ,以及這個庫中三個最重要的演算法。

namespace boost {
template <class charT,
class traits=regex_traits<charT> >
class basic_regex {
public:
explicit basic_regex(
const charT* p,
flag_type f=regex_constants::normal);

bool empty() const;

unsigned mark_count() const;

flag_type flags() const;
};

typedef basic_regex<char> regex;
typedef basic_regex<wchar_t> wregex;
}

成員函數
explicit basic_regex (
const charT* p,
flag_type f=regex_constants::normal);

這個建構函式接受一個包含Regex的字元序列,還有一個參數用於指定使用Regex時的選項,例如是否忽略大小寫。如果p中的Regex無效,則拋出一個 bad_expression 或 regex_error 的異常。注意這兩個異常其實是同一個東西;在寫這本書之時,尚未改變當前使用的名字 bad_expression ,但下一個版本的Boost.Regex將會使用 regex_error.

bool empty() const; 

這個成員函數是一個謂詞,當basic_regex實例沒有包含一個有效Regex時返回 true ,即它被賦予一個空的字元序列時。

unsigned mark_count() const; 

mark_count 返回regex中帶標記子運算式的數量。帶標記子運算式是指Regex中用圓括弧括起來的部分。匹配這個子運算式的文本可以通過調用某個Regex演算法而獲得。

flag_type flags() const;

返回一個位元遮罩,其中包含這個basic_regex所設定的選項標誌。例如標誌 icase, 表示Regex忽略大小寫,標誌 JavaScript, 表示regex使用JavaScript的文法。

typedef basic_regex<char> regex;
typedef basic_regex<wchar_t> wregex;

不要使用類型 basic_regex來定義變數,你應該使用這兩個typedef中的一個。這兩個類型,regex 和 wregex, 是兩種字元類型的縮寫,就如 string 和 wstring 是 basic_string<char> 和 basic_string<wchar_t>的縮寫一樣。這種相似性是不一樣的,某種程度上,regex 是一個特定類型的字串的容器。

普通函數
template <class charT,class Allocator,class traits >
bool regex_match(
const charT* str,
match_results<const charT*,Allocator>& m,
const basic_regex<charT,traits >& e,
match_flag_type flags = match_default);

regex_match 判斷一個Regex(參數 e)是否匹配整個字元序列 str. 它主要用於驗證文本。注意,這個Regex必須匹配被分析串的全部,否則函數返回 false. 如果整個序列被成功匹配,regex_match 返回 True.

template <class charT,class Allocator, class traits> 
bool regex_search(
const charT* str,
match_results<const charT*,Allocator>& m,
const basic_regex<charT,traits >& e,
match_flag_type flags = match_default);

regex_search 類似於 regex_match, 但它不要求整個字元序列完全符合。你可以用 regex_search 來尋找輸入中的一個子序列,該子序列匹配Regex e.

template <class traits,class charT>
basic_string<charT> regex_replace(
const basic_string<charT>& s,
const basic_regex<charT,traits >& e,
const basic_string<charT>& fmt,
match_flag_type flags = match_default);

regex_replace 在整個字元序列中尋找Regexe的所有匹配。這個演算法每次成功匹配後,就根據參數fmt對匹配字串進行格式化。預設情況下,不匹配的文本不會被修改,即文本會被輸出但沒有改變。

這三個演算法都有幾個不同的重載形式:一個接受 const charT* (charT 為字元類型), 另一個接受 const basic_string<charT>&, 還有一個重載接受兩個雙向迭代器作為輸入參數。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.