2014-03-13 102 views
0
ifstream infile("somefile.txt"); 
    char letter; 
    infile >> noskipws >> letter; 
    string word; 
    word = letter; 
    while(regex_match(word, regex("[A-Za-z_][A-Za-z0-9_]*", regex_constants::basic))){ 
     infile >> letter; 
     word += letter; 
    } 
    if(regex_match(word, regex("[A-Za-z_][A-Za-z0-9_]*.", regex_constants::basic))){ 
     //Do stuff 
    } 

当我运行这段代码和GDB看它正则表达式驱动,while循环将是infile是喂养letter在文本文件中执行恰好一次,无论是文字。然后,它会跳过if语句,因为if语句显然返回false。此功能的每次运行都应该有word将整个单词保存在infile的当前位置。我的正则表达式失败了?或者是别的什么?while循环不循环正常

举例说明:仅包含单词“文字失败”的文本文件将在函数结尾处包含“wo”。

+0

我真的不明白你想要做什么,但在有些观点需要消耗空间,否则'while'循环将匹配第一个单词,然后停止匹配,因为下一部分以空格(或标点符号或非[A-Za-z_])开头。并且在'if'中的示例代码中,有一个变量'recognised',它在任何地方都没有声明... –

+0

@ mathematical.coffee这正是循环应该如何操作的。相反,“单词”一次不会超过2个字符,它们将是任何字符。 – MowDownJoe

回答

0

从升压文档的:

'The algorithm regex_match determines whether a given regular expression matches 
all of a given character sequence' 

如果您的初始word不匹配,它永远不会被追加到。
因此,无论是同时和如果失败。

+0

以示例更新问题。我知道这些代码行应该如何工作。问题是,为什么他们的行为方式实际上是这样。 – MowDownJoe

+0

@MowDownJoe - 使用'regex_constants :: perl'试试它,并在regex_match语句之前验证'word'变量的内容。 – sln

+0

我应该澄清,我没有使用Boost正则表达式,而是使用-std = C++ 0x编译的std :: regex。另外,在第一次regex_match之前,单词只有文件中的第一个字符。 – MowDownJoe

1

@MowDownJoe - 我相信std::regexboost::regex,但你为什么玩耍,分配一个常数和测试regex_match()。如果它工作的很好,如果不行,regex在编译的Lang中不起作用。

+0

当您发布答案时,您不必通过使用'@'标记用户询问问题。当他/她的问题的回答发布时,用户将以任何方式得到通知。 – rockinfresh

+0

你不能说std :: regex是boost :: regex。如果你使用std :: regex,你得到你的编译器供应商的std :: regex的*实现,而不是boost。同样std :: regex在boost :: regex之后被建模,虽然有一些差异。 – harmic

1

我认为你看到的是std :: regex的错误执行的结果。我想一个更简单的使用相同的正则表达式(见http://ideone.com/xuY2nD):

#include <iostream> 
#include <regex> 
using namespace std; 

int main() { 

    string s = "He"; 
    if (regex_match(s, regex("[A-Za-z_][A-Za-z0-9_]*", regex_constants::basic))) { 
     cout << "Match" << endl; 
    } 

    return 0; 
} 

,并没有匹配 - 这是应该做的。然后,我尝试了同样的事情,但使用boost :: regex,它按预期工作。

从什么我read gcc版本< 4.9没有工作std :: regex的支持。

几面指针:

  • 构建正则表达式实例可以是昂贵的 - 你不应该这样做在一个循环中,你已经做了。事实上,如果函数在程序中被多次调用并且正则表达式是常量,那么最好声明一个静态常量实例

  • 在任何情况下,如果您只是检查你添加到你的'单词'的字符,而不是重新匹配整个单词。您知道您添加的字符到目前为止已经匹配,因此不需要重新匹配整个字符串。

  • 第二个正则表达式匹配也似乎是多余的 - 如果在循环中的第一个工作,然后第二个必须匹配