2017-07-07 8 views
0

正規表現を使って文字列中の小文字の数を数えようとしています。私は盲目的に何かを見逃していると思うが、何が分からないのだろうか?古い古典的なASPページです。正規表現で小文字を数えよう

<% 
Password="abcd123" 
Set myRegExp = New RegExp 
myRegExp.Pattern = "(.*[a-z].*)" 
Response.Write myRegExp.Execute(Password).Count 
%> 

スクリプトが1を返すのではなく4

答えて

2

あなたのキャプチャグループが間違っている、これで十分です:([a-z]).*を使用すると、小文字の周囲のすべてをキャプチャします。

+0

私が削除した*パターンから、このため –

1

(.*[a-z].*)を使用すると、文字単位ではなく1文字の入力と一致するため、代わりに[a-z]を使用しないのはなぜですか?

あなたがここでの違いをチェックすることができます
[a-z] regex
(.*[a-z].*) Your regex

私も読書をお勧め:私は次のようだと思う

+0

感謝をありがとう - 。私はあなたがお勧めの記事:)このため –

1

は、あなたがしたいものです行う。

Password="abcd123" 
Set myRegExp = New RegExp 
myRegExp.Global = True ' This is required to get all matches 
myRegExp.Pattern = "[a-z]" 
Response.Write myRegExp.Execute(Password).Count 

しかし、私はあなたにいくつかの提案があります。

  • あなたのルールは+で欲しいものにすることができます。これにより、サイクルが短縮されます。

  • 最初のものだけでなく、.GlobalからTrueまでをすべて一致させる必要があります。

  • この方法では、適切な結果を見つけるために一致コレクション(myRegExp.Executeから返されます)をループする必要があります。

Password="abcd123fooBar" 
Set myRegExp = New RegExp 
myRegExp.Pattern = "[a-z]+" 
myRegExp.Global = True 
count = 0 
For Each match In myRegExp.Execute(Password) 
    count = count + match.Length 
Next 
Response.Write count 'prints 9 

そして、ここで同じに別の方法です。

これはすべて小文字ではない文字と一致し、結果文字列からそれらを削除します。その後、Len機能を使用して長さを取得することができます。

Password="abcd123fooBar" 
Set myRegExp = New RegExp 
myRegExp.Pattern = "[^a-z]+" 
myRegExp.Global = True 
count = Len(myRegExp.Replace(Password, "")) 
Response.Write count 'prints 9 
+0

感謝を読んであげる - trueに設定すると、グローバルジグソーパズルの最後の作品でした。 –

+0

実際にループする必要はありませんでした。使用できるようになりました: –

+0

myRegExp.Execute(Password).Count –

関連する問題