《》〈〉(){}【】『』,出現的標點種類不確定,但出現即必須成對。
《童年》練習題(含答案)_『百度文庫』 成立
《童年練習題(含答案)_百度文庫 不成立
《童年》練習題(含答案_百度文庫 不成立
《童年》練習題【含答案】_(百度文庫 不成立
《童年》練習題【含答案】_(百度文庫) 成立
uj5u.com熱心網友回復:
正則不是最好的選擇,它需要用到平衡組,寫著麻煩還不好維護。使用代碼進行狀態分析,只要幾行代碼,還快。
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;
}
uj5u.com熱心網友回復:
更正(#1樓):static bool IsBalanced(string input)
{
...
return couters.All(x => x == 0);
}
uj5u.com熱心網友回復:
根據樓上提示的平衡組,自已摸索著搞定,加了一些條件,不匹配空格換行,。、;等
[^,,、。:?;“”《》〈〉()()【】『』{}\s]*(((?'jxfinest'(“|《|〈|(|\(|【|『|{))[^,,、。:?;“”《》〈〉()()【】『』{}\s]*)+((?'-jxfinest'(”|》|〉|)|\)|】|』|}))[^,,、。:?;“”《》〈〉()()【】『』{}\s]*)+)*(?(jxfinest)(?!))
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
鼓勵并贊一個。
如果你要符號匹配,可能要用多個平衡組。只用總量匹配,不能解決如下的輸入:
《童年 文庫』
用正則的目的,是使開發更加容易。如果發現正則更麻煩,就是時候考慮其他做法。
uj5u.com熱心網友回復:
你提到的:《童年 文庫』的情況
我記得我是考慮過這種情況的呀,但是現在國慶回家在車上沒有電腦驗證,我這里是
(”|》|〉|)|\)|】|』|})
而非
[”》〉)\)】』}]
uj5u.com熱心網友回復:
經驗證,確實存在 github_36000833 所述BUGuj5u.com熱心網友回復:
使用多個平衡組,是可以做到每組平衡。(?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; // 所有配對必須完成
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/111902.html
標籤:C#
