首先,記得#include <regex>
。
C++ std::regex_match
與其他語言的正則表達式很像。
讓我們先從一個簡單的例子:
std::string str = "Mem(100)=120";
std::regex regex("^Mem\\([0-9]+\\)=[0-9]+$");
std::cout << std::regex_match(str, regex) << std::endl;
在這種情況下,我們的正則表達式是^Mem\([0-9]+\)=[0-9]+$
。 讓我們來看看它做什麼:
- 的
^
開頭講述C++,這是線開始的地方,所以應該AMem(1)=2
不匹配。
$
最後告訴C++這是行結束的地方,所以Mem(1)=2x
應該不匹配。
\\(
是一個文字(
字符。 (
在正則表達式中有一個非常特殊的含義,所以我們將其轉義爲\(
。但是,\
字符在C++字符串中有特殊含義,所以我們使用\\(
來告訴C++將\(
傳遞給正則表達式引擎。
[0-9]
符合數字。 \\d
也應該可以工作,但then again maybe not。
[0-9]+
表示至少一個數字。如果Mem()
是可以接受的,則改爲使用[0-9]*
。
正如您所見,這就像您在其他語言(如Java或C#)中找到的正則表達式一樣。
現在要考慮的空白,使用std::regex regex("^\\s*Mem\\([0-9]+\\)\\s*=\\s*[0-9]+\\s*$");
注意\s
包括\t
,因此無需同時指定。如果沒有,請使用(\s|\t)
或[\s\t]
,而不是(\s,\t)
。
最後,要包含浮點數,我們首先需要考慮是否可以接受Mem(1) = 1.
(也就是後面沒有數字的點)。
如果不是,則中的.23
是可選。在正則表達式中,我們使用?
來表示。
std::regex regex("^[\\s]*Mem\\([0-9]+\\)\\s*=\\s*[0-9]+(\\.[0-9]+)?\\s*$");
注意,我們使用\.
,而不只是.
。 .
在正則表達式中有特殊含義 - 它匹配任何字符 - 所以我們需要逃避它。
如果您有支持原始字符串編譯器(如Visual Studio 2013,GCC 4.5,Clang 3.0),可以簡化正則表達式的字符串:
std::regex regex(R"(^[\s]*Mem\([0-9]+\)\s*=\s*[0-9]+(\.[0-9]+)?\s*$)")
提取有關匹配字符串的信息,您可以使用std::smatch
和團體。
讓我們先從一個小的變化:
std::string str = " Mem(100)=120";
std::regex regex("^[\\s]*Mem\\(([0-9]+)\\)\\s*=\\s*([0-9]+(\\.[0-9]+)?)\\s*$");
std::smatch m;
std::cout << std::regex_match(str, m, regex) << std::endl;
注意三件事情:
- 我們加入
smatch
。這個類存儲關於匹配的額外結果信息。
- 我們在
[0-9]*
附近添加了附加括號。這定義了一個組。組告訴正則表達式引擎跟蹤其中的任何內容。
- 圍繞浮點數的更多括號。這定義了第二組。
非常重要定義組的括號內沒有逃過,因爲我們不想讓他們來匹配實際括號字符。我們實際上需要特殊的正則表達式的含義。
現在我們有了羣體,我們可以使用它們:
for (auto result : m) {
std::cout << result << std::endl;
}
這將首先打印整個字符串,然後將數Mem()
,那麼最後的數字。
換句話說,m[0]
給我們整場比賽,m[1]
給我們的第一組,m[2]
給了我們第二組和m[3]
會給我們第三組,如果我們有一個。
我不太明白這個問題。如果你想知道如何在C++中使用正則表達式,那裏有很多例子。順便說一下,你可能應該跳過你的括號 - '... Mem \([0-9] * \)...'。 – Dukeling
@Dukeeling,這就是我在這裏問的原因。我既沒有找到類似的例子,也沒有弄清楚正則表達式模式匹配是如何工作的。 –
正則表達式對於這樣一個簡單的模式是矯枉過正的。將行讀入字符串,搜索'(',搜索')',搜索下一個數字。 –