在带有一些约束(内括号)正则表达式的句子中查找括号之间的单词

时间:2015-08-06 11:07:57

标签: c++ regex

我有以下句子:

foreach ($arr as $key => $value) {
    echo "Key: $key; Value: $value<br />\n";
}

正则表达式

我使用以下正则表达式来提取括号 [[]] 之间的单词:

[[Image:Levellers declaration and standard.gif|thumb|200px|Woodcut from a [[Diggers]] document by william everard]]

输出应该等于以下句子:

regex = "\\[\\[(.*?)\\]\\]"

我只想考虑最左侧的括号]]

问题

正则表达式将摘录Image:Levellers declaration and standard.gif|thumb|200px|Woodcut from a [[Diggers]] document by william everard 并离开[[Image:Levellers declaration and standard.gif|thumb|200px|Woodcut from a [[Diggers]]

问题

如何忽略]] 表示的内部括号。

更新V0

我编写了一个受BalancedParentheses.cpp启发的简单程序,以便在字符串中的括号之间找到文本的开头结尾

源代码

document by william everard]]

输出

    #include <stack>
    #include <iostream>
    #include <vector>
    #include <string>

    using namespace std;
    bool AreParanthesesBalanced(string exp)
    { 
        stack<char>  S;
        vector<pair<int, int>> index;
        int end;
        vector<int> start;
        for(int i = 0; i < exp.length(); i++)
        {
           if(exp[i] == '(' || exp[i] == '{' || exp[i] == '[')
           {
             S.push(exp[i]);
             start.push_back(i);
            }

            else if(exp[i] == ')' || exp[i] == '}' || exp[i] == ']')
            {
                if(S.empty() || !ArePair(S.top(),exp[i]))
                {
                  return false;
                }

               else
               {
                 S.pop();
                 end = i;
                 index.push_back(make_pair(start[start.size() - 1] ,end));
                 start.pop_back();
               }      
            }
         }

         for(int i = 0; i < index.size(); i ++)
         {
            cout << index[i].first <<"  "<< index[i].second << endl;
         }
       return S.empty() ? true:false;
   }

        int main()
        {
          string exp = "[[Image:Levellers declaration and standard.gif|thumb|200px|Woodcut from a [[Diggers]] document by william everard]] ";

           bool x = reParanthesesBalanced(exp);
           return 0;
        }

1 个答案:

答案 0 :(得分:1)

我认为你的问题是你使用了一个懒惰的(*)量词,而不是一个贪婪的(]])量词。

懒惰量词会在遇到字符串中的第一个regex = "\\[\\[(.*)\\]\\]" 时立即停止,即使它不是最后一个。

您只需将正则表达式修改为:

NSKeyedArchiver