2012-03-20 84 views
2
checkFormat(string &s) 
{ 

} 

string s是一個表示日期的字符串。如何比較C++中的字符串?

我想比較一個字符串s,找出它是否用「yyyy:mm :: dd」來表示。

我該怎麼辦?

比較char char?如果字符串是「600:12:01」呢?

對不起,我英文很差。

+0

如果您有一個相對較新的編譯器,則可以使用C++ 11 [reular表達式](http://en.cppreference.com/w/cpp/regex)。 – 2012-03-20 10:58:03

+0

如果你不這樣做,你可以使用Boost正則表達式。非常相似。 – MSalters 2012-03-20 11:03:39

+0

公元600年12月1日有問題嗎?我更擔心'2012:5:7';前導零不會始終如一地使用。 – MSalters 2012-03-20 11:40:39

回答

4

請勿使用正則表達式。使用strptime(),其目的是解析時間字符串(因此名稱:str p time,字符串 - >解析 - >時間)。一個正則表達式不能確定2013:2:29是無效的。

+0

在C++中沒有'strptime()'。這是一個開放系統(Unix)擴展。這意味着它不可移植。 – 2012-03-20 12:15:42

+0

@JamesKanze:多可惜太,我不明白爲什麼'strftime'將可沒有反向部分:X儘管如此,''頭包含這一流派的不少quircks。 – 2012-03-20 12:37:32

+0

公平點。 [升壓日期時間](http://www.boost.org/doc/libs/1_49_0/doc/html/date_time/examples.html#date_time.examples.dates_as_strings)呢?又見http://stackoverflow.com/questions/321849/strptime-equivalent-on-windows – MSalters 2012-03-20 13:06:36

2

下面是一個算法一個想法:

  1. 檢查長度是所預期的。這很快。
  2. 檢查冒號是否在預期的地方。
  3. 檢查前四個字符是數字。
  4. 檢查中間的兩個字符是數字。
  5. 檢查最後兩個字符是數字。

如果任一測試失敗,則返回false。如果你全部通過了,請返回true

當然,這並不驗證值的範圍。此外,你並不是真正的「比較」,你是「驗證」。

+0

+1,因爲傑米Zawinski的名言:有些人,當遇到問題時,認爲「我知道,我會用正則表達式。」現在他們有兩個問題。 – 2012-03-20 11:11:34

+0

@MatthieuM。因此,你用大約20行代碼替換了一行代碼,這些代碼實際上不可維護(甚至如上所述,可能不會正確地完成這項工作,因爲你確實想要允許一些自由,例如'「2011:3 :3" ')。如果你不想使用正則表達式(1行),你可以用大約3或4的'istringstream'完成這個工作;如果您也想轉換,這可能是首選解決方案,因爲它可以同時進行轉換。 – 2012-03-20 12:18:47

+0

@JamesKanze:我只是擔心*預製*解決方案,只是不能平息。正則表達式不是銀色的子彈,正確的工程需要考慮替代方案,而不是先將頭部潛入第一個可能的解決方案。正則表達式*可能是最終的解決方案,或者它們可能不是,根據要求,我們只要確保沒有適當的反射就不會丟棄替代方案。 – 2012-03-20 12:36:34

1

您可以使用Boost Regex來檢查字符串是否符合您的模式。

1

這是正則表達式的工作。由於您使用C++,因此Boost.Regex是一種選擇。

0

您的編譯器是否支持正則表達式,即您是否使用符合C++ 11標準的編譯器?這將使任務更容易...否則,你可能想求助於Boost.Regex

假定你可以使用C++ 11,下面的代碼應該做你想要的(雖然未經測試)是什麼:

std::regex rx("\\d{4}:\\d{2}:\\d{2}"); 
return regex_match(s.begin(), s.end(), rx); 

約翰庫克寫an introduction into C++ regular expressions。如果您的編譯器支持C++ 11,只需將std::tr1的每次出現替換爲std即可。