[英]L={a^nb^m| n+m=k ,n,m>=0} with Regular Expression in C#
我想要生成以下語言:
L={a^nb^m| n+m=k ,n,m>=0}
對於常數k
。
我正在使用名稱空間System.Text.RegularExpressions
的類Regex
。
我現在最好的解決方案是:
public void Match(string input, int k)
{
Regex regex = new Regex(@"a*b*");
Match match = regex.Match(input);
if(match.Length==k)
Console.WriteLine("Successfully");
else
Console.WriteLine("Don't match");
}
對於k=5
,以下輸入成功:
"aaabb"
"aabbb"
"aaaaa"
例如,這不是:
"aaabbb"
"ab"
實現這一目標的最優雅方式是什么?
您可以使用展望來實現它
對於k = 5
/^(?=.{5}$)a*b*$/
(?=.{5}$)
預測正好。 確保字符串僅包含5個字符。
a*b*
匹配零或更多的a
然后出現零或更多b
測試
public static void Match(string input, int k)
{
Regex regex = new Regex(@"^(?=.{"+k+"}$)a*b*$");
Console.WriteLine(regex.IsMatch(input));
}
Match("aaabb", 5);
=> True
Match("aaabbb", 5);
=> False
nu11p01n73R的答案使用了前瞻,這是實際正則表達式中常用的,但不是理論正則表達式的一部分(其中連接,交替和Kleene星是唯一可用的運算符)。
對於這種情況,在理論正則表達式中沒有干凈的解決方案。 您只能列出所有案例。 例如,如果k = 5:
aaaaa|aaaab|aaabb|aabbb|abbbb|bbbbb
你最多可以通過分組來縮短它:
aaa(aa|ab|bb)|(aa|ab|bb)bbb
語言是常規的。 k
是一個常數,所以我們總是可以繪制一個2k + 1狀態的狀態機。
k = 5的示例:
丟失的轉換進入陷阱狀態,該狀態不是接受狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.