2012-07-11 54 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 
相关问题