2012-03-24 51 views
1

我正在試圖找到所有的浮點數(可能是以 -/+前綴的指數形式)。例如,以下是有效格式:-1.2 +1.2 .2 -3 3E4 -3e5 e-5這個正則表達式無法解析所有有效的浮點數

文本來源包含若干以空格或逗號分隔的數字。我需要使用正則表達式來告訴

  1. 告訴我們,如果有任何無效的數字(例如1.2 3.2 S3)S3是不是一個有效的
  2. 列表中的每一個有效的數字

我沒有知道怎麼去(1)完成,但對於(2),我使用boost ::正則表達式和下面的代碼

wstring strre("[-+]?\\b[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?\\b"); 
wstring src("1.2 -3.4 3.2 3 2 1e-3 3e3"); 
boost::wregex regexp(strre); 
boost::match_results<std::wstring::const_iterator> what; 
regex_search(src, what, regexp, boost::match_continuous); 
wcout << "RE: " << strre << endl << endl; 
wcout << "SOURCE: [" << src << "]" << endl; 

for (int i=0; i<what.size(); i++) 
    wcout << "OUTPUT: [" << wstring(what[i].first, what[i].second) << "]"<< endl; 

但這個代碼只顯示我的第一個數字(1.2)。我也嘗試boost :: match_all,boost :: match_default,結果相同。

其他信息: 大家好,我們不用擔心雙反斜槓問題,它在我的代碼中正確表達(因爲在我的測試代碼中,我從文本中讀取字符串而不是顯式字符串)。無論如何,我修改代碼如下

wstring strre("[-+]?\\b[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?\\b"); 
boost::wregex regexp(strre); 
boost::match_results<std::wstring::const_iterator> what; 
wcout << "RE: " << strre << endl << endl; 
while (src.length()>0) 
{ 
    wcout << "SOURCE: [" << src << "]" << endl; 
    regex_search(src, what, regexp, boost::match_default); 
    wcout << "OUTPUT: [" << wstring(what[0].first, what[0].second) << endl; 
    src = wstring(what[0].second, src.end()); 
} 

現在,它被正確地顯示一切單號碼,但我不得不運行regex_search一些時間,由於它每次只給一個號碼。那麼,我只是不明白爲什麼regex_search不會給我所有的結果。有沒有辦法一次運行搜索並獲得所有結果?

回答

2

您通常必須在C++字符串中雙重轉義反斜槓。所以你的"\."變成只有.。你會需要它是"\\."等。同樣,你的"\b"不是一個字界限,而是一個字面退格!修正方法如下:"\\b"

另外,哪個文檔爲strre類?你確定它理解你正在使用的語言嗎?

顯然,新的C++標準具有原始字符串文字。這些工作類似於Go中的「反向」字符串,或者像Perl中的「單引號」字符串或/ patterns /。詳情請參閱this answer

編輯

下面是用於檢測浮點文字有點票友模式,但不使用反斜線:

[+-]?(?=[.]?[0-9])[0-9]*(?:[.][0-9]*)?(?:[Ee][+-]?[0-9]+)? 

注意,它需要向前看符號,這ERES不支持。你應該使用PCRE這個庫。分解,這是

[+-]?     # optional leading sign 
(?=[.]?[0-9])   # lookahead for a digit, maybe with an intervening dot 
[0-9]*     # maybe some digits 
(?:[.][0-9]*)?   # maybe a (dot plus maybe some digits) 
(?:[Ee][+-]?[0-9]+)? # maybe an exponent, which may have a sign and must have digits 

模式禮貌Perl的Regexp::Common圖書館。

+0

謝謝。但是對於無斜線版本,上面的代碼仍然只能檢索第一個匹配的數字,而不是所有的數字 – user1285419 2012-03-24 18:22:32

+0

@ user1285419它沒有斜線;它沒有反斜槓。方式不同!如果你逐漸/反覆地調用它,它會返回所有這些。 – tchrist 2012-03-24 18:23:36