我有以下句子:
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]]
。
如何忽略]] 表示的内部括号。
我编写了一个受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;
}
答案 0 :(得分:1)
我认为你的问题是你使用了一个懒惰的(*
)量词,而不是一个贪婪的(]]
)量词。
懒惰量词会在遇到字符串中的第一个regex = "\\[\\[(.*)\\]\\]"
时立即停止,即使它不是最后一个。
您只需将正则表达式修改为:
NSKeyedArchiver