2012-07-11 39 views
0

我想計算一個字符串中可以包含非數字的位數(aa11aa1a)。我能用有限狀態機解決這個問題嗎?這個問題可以表示爲正則表達式嗎?我可以通過FSM計算字符串中的位數嗎?

如果我想知道計數是否爲「X」,那麼它會改變性質問題?更確切地說,這個字符串中有3位數字嗎? FSM是否足以解決問題?

回答

1

第二個問題可以用正則表達式來解決。

考慮:^[^0-9]*[0-9][^0-9]*[0-9][^0-9]*[0-9][^0-9]*$

你也可以使用組:^[^0-9]*([0-9][^0-9]*){3}$

我不認爲你可以使用正則表達式獨自解決的第一個問題。但使用正則表達式(刪除所有非數字,或匹配單個數字)的解決方案將是微不足道的。

+0

在{3}之前我們不需要「\ *」。那麼這個羣體可以重複? {3}如何能像星星一樣重複? ^ [^ 0-9] *([0-9] [^ 0-9] *)* {3} $ – 2012-07-11 17:19:54

+0

@mert:不,「{3}」本身就是優惠券。這意味着「重複3次」。一般形式是「{n,m}」,意思是「重複n次到m次」。 – cha0site 2012-07-11 17:22:37

+0

最後一件事111aaaa,這個字符串被驗證成功。但長度不是3.所以用「\ *」註釋的模式不會改變/遞增計數器? – 2012-07-11 17:34:45

0

如果你只是想匹配三位數像

/[^0-9]*[0-9][^0-9]*[0-9][^0-9]*[0-9][^0-9]*/ 

如果匹配字符串中只包含三位數。

+0

我認爲^ [^ 0-9] *([0-9] [^ 0-9] *){X} $是cha0site建議的更一般的解決方案。 – 2012-07-11 17:16:37

0

而不是使用顯式FSM,我建議使用一個正則表達式來取出所有的非數字,然後只取得結果字符串的長度。或者,將您的正則表達式與單個數字進行匹配,然後計算匹配次數(但這可能效率較低)。或者,最簡單的方法(僞代碼):

count = 0 

for char in string 
    if char is a digit 
     increment count 

// For your second part 
    if count > X 
     count isn't X; done 

if count < X 
    count isn't X; done 
else 
    count is X; done 
相關問題