110,567
社区成员
发帖
与我相关
我的任务
分享
(?x) # 允许空白和注释
^
(
[^《》〈〉(){}【】『』] # 不包含特定符号的
|
《(?<dab>) | 》(?<-dab>) # 看到《》,相应增减dab(Double Angle Bracket)平衡组
|
〈(?<ab>) | 〉(?<-ab>)
|
\((?<p>) | \)(?<-p>)
|
{(?<cb>) | }(?<-cb>)
|
【(?<sqb>) | 】(?<-sqb>)
|
『(?<cnb>) | 』(?<-cnb>)
)*
(?(dab)(?!)) #检查Double Angle Bracket平衡组余量不为零
(?(ab)(?!)) #检查Angle Bracket平衡组
(?(p)(?!)) #检查Parenthesis平衡组
(?(cb)(?!)) #检查CurlyBrace平衡组
(?(sqb)(?!)) #检查SquareBracket平衡组
(?(cnb)(?!)) #检查CornerBracket平衡组
$
这样可以做到每组平衡。比如
《童年【练习题含答案】》
不过,交错匹配还待改进,即还不能判断如下交错配对(如果需要严格配对的话):
《童年【练习题含答案》】
用代码就容易控制了:
class Program
{
static void Main(string[] args)
{
var b1 = IsBalanced("《童年》练习题【含答案】_(百度文库) 成立"); // true
var b2 = IsBalanced("《《《《《《童年》【含答案】》》(百度文库)》》》"); // true
var b3 = IsBalanced("《童年 文库』"); // false
var b4 = IsBalanced("《童年【练习题含答案》】"); // false;
}
static bool IsBalanced(string input)
{
const string pairs = "《》〈〉(){}【】『』";
var stack = new Stack<char>();
foreach(char c in input)
{
int i = pairs.IndexOf(c);
if (i == -1)
{
continue; // 非符号,跳过
}
if (i % 2 == 0)
{
stack.Push(c); // 偶数为符号开启,入栈
}
else // 奇数为符号结束,检查堆栈顶必须是配对的‘符号开始’
{
if (stack.Count == 0 || stack.Pop() != pairs[i - 1])
{
return false;
}
}
}
return stack.Count == 0; // 所有配对必须完成
}
}
《童年 文库』
用正则的目的,是使开发更加容易。如果发现正则更麻烦,就是时候考虑其他做法。[/quote]
你提到的:《童年 文库』的情况
我记得我是考虑过这种情况的呀,但是现在国庆回家在车上没有电脑验证,我这里是
(”|》|〉|)|\)|】|』|})
而非
[”》〉)\)】』}]《童年 文库』
static bool IsBalanced(string input)
{
const string pairs = "《》〈〉(){}【】『』";
var counters = new int[pairs.Length / 2];
input
.Select(x => pairs.IndexOf(x))
.Where(x => x >= 0)
.ToList()
.ForEach(x => counters[x / 2] += ((x & 1) * 2 - 1));
return counters.Sum() == 0;
}