2013-11-15 46 views
-2

我想兩個字符串在C++比較:慣用方式在C++中匹配一個正則表達式

  1. 有一個函數getName()返回一個字符串。
  2. 現在我可以寫Out << getName();這將打印字符串。
  3. 但是我想打印字符串只有如果它的值是arpitarpit*N*其中ñ是一個整數。我不要想要打印它,如果它的值是arpita,arpitx,其中是一個整數或空字符串以外的東西。

我知道這可以很容易地完成,但我想用最少的行數來做到這一點。

我做了什麼至今:

char name1[] = getName(); 
char name2[] = "arpit"; 
for (int x = 0; x <= 4; x++){ 
    if (name1[x] == name2[x]) continue; 
    else return (Out << "not equal") ; 
    } 
while(name1[x] ! = "\0"){ 
    if(isdigit(name1[x]) 
    x++; 
    else return (Out << "not equal") ; 
    } 
Out << getName(); 

更新1 getName()返回一個字符串,直到它遇到的空白,而且將不返回任何行或2個或更多的話。

+5

嗯。你有什麼嘗試?顯示一些努力,*可愛請*。只是要求這樣的解決方案不是SO的目的。 –

+0

'std :: string s = getName();如果(s.size()> = 5 && s.substring(0,5)==「arpit」)Out << s;' – john

+1

boost :: starts_with(getName(),「arpit」)''怎麼辦? – Mithrandir

回答

2

如果你有C++ 11:

static std::regex const matcher("arpit\\d*"); 

if (regex_match(name, matcher)) { 
    // matches... 
} 

如果你沒有C++ 11,提振::正則表達式是幾乎相同。

如果你沒有C++ 11,你不能使用boost:

if (name1.size() >= name2.size() 
    && std::equal(name2.begin(), name2.end(), name1.begin()) 
    && std::find_if(name1.begin() + name2.size(), 
        name1.end(), 
        [](unsigned char ch) { return !isdigit(ch); } 
        ) == name1.end()) 
    // matches... 
} 

對於剩下的,你的代碼中有相當多的錯誤,不應該 編譯。特別是什麼也沒有其中getName() 可能返回哪些可以用來初始化char [];在 型C++字符串是std::string,你的變量 應該是:

std::string name1(getName()); 
std::string name2("arpit"); 

(除了你需要更好的名字第二個可能是 像referenceheader,例如。)

當然,這是未定義的行爲調用isdigit與 a char;您必須先轉換爲unsigned char

1
auto s = getName(); 
if(s.size() >= 5 && s.substr(0,5) == "arpit") 
    Out << s; 
+0

'getName'是否返回其他地方存在的引用?他說它返回了一個字符串。除非它返回一個引用,否則將它分配給一個引用就是多餘的語言(並且可以稍微減慢程序)。 –

+0

這是對'auto'的公然濫用,甚至可能使程序不正確(例如,如果getName()返回一個char const *即使getName返回一個std :: string也沒有必要混淆 –

+0

最後,當然,這不會做他所要求的,因爲它也會打印'「arpita」等等。(更不用說比較前5個字符的有效方法比) –

0
std::set<std::string> m_allowed_strings; 

std::string validate_string(const string & s) 
{ 
    if(m_allowed_strings.find(s) != m_allowed_strings.end()) 
      return s; 
    return ""; 
} 

cout << validate_string(getName()); 
+0

看起來像是過度使用了,我們是否需要調用'getName'兩次?我們還沒有被告知它實際在做什麼,例如,它可能會從名稱文件中返回每一行,例如 – BoBTFish

+0

@ BoBTFish你是對的,我會更新代碼 – Raxvan

+0

我不認爲在這裏使用'set'是可能的,這當然是不合理的,雖然他的例子只有'arpit'後面有1位數字,但他嘗試編碼表明可以有更多的;這意味着t有效字符串的集合是無限的。 –