2017-05-29 8 views
0

私の関数はすべての正規表現を処理し、trueまたはfalseを返さなければなりません。良い取り組んでいます...まだ今空の文字列で正規表現が機能しない - Swift

func test(_ input: String) -> Bool { 

let pattern = ".{7}" //allow exactly 7 numbers 
let regex = try! NSRegularExpression(pattern: pattern, options: [NSRegularExpression.Options.caseInsensitive]) 


let leftover = regex.stringByReplacingMatches(in: input, options: [], range: NSMakeRange(0, input.characters.count), withTemplate: "") 

if leftover.isEmpty { 
    return true 
} 
return false 
} 


print(test("123456")) //false 
print(test("1234567")) //true 
print(test("12345678")) //false 
print(test("")) //true - I expect false 

test("")が偽である理由だから私は理解しています。しかし、正規表現を修正して、それが偽になるのはどうすればいいですか? 時々私は正規表現を使用します.*私の関数はこれも処理する必要があります。だから私はあなたの正規表現で^$を追加することにより、ソリューションは、あなたの正規表現は、あなたがこれを行うことができますので、有効にする文字列全体にマッチしなければならないことを指定することで、この

if input.isEmpty { return false }

+0

(私は正規表現をcorreclty覚えていれば)私はですが、最初から文字列の末尾に使用する必要があり、私がしたいことを言うためにあなたの正規表現に「^」を追加して行くと「$」と思います代わりに 'numberOfMatchesInString:options:range:'を呼び出してください。 – Larme

+0

正規表現の変更だけが機能しません。私はnumberOfMatchesInStringを試してみます:options:range – kuzdu

+0

もちろん、オプションのうちの1つだけが動作しません。だから 'let pattern =" ^。{7} $ "//正確に7つの数字を許してください。正規表現=試してみましょう! NSRegularExpression(パターン:パターン、オプション:[.caseInsensitive]); numberOfOccurences = regex.numberOfMatches(入力:options:[]、範囲:NSMakeRange(0、input.characters.count)); return(numberOfOccurences!= 0) 'はトリックを行います。 – Larme

答えて

2

inputが空の文字列の場合は、leftoverも空の文字列 になるため、関数はtrueを返します。 あなたのアプローチが失敗したもう一つのケースは、

print(test("12345671234567")) // true (expected: false) 

代替手段です.regularExpressionオプションでStringrange(of:)方法を使用することです。一致した範囲が文字列全体であるかどうかを確認します。 7 (としない7任意の文字)と一致させるために

、 パターンは\d{7}であるべきです。

func test(_ input: String) -> Bool { 

    let pattern = "\\d{7}" 
    return input.range(of: pattern, options: [.regularExpression, .caseInsensitive]) 
      == input.startIndex..<input.endIndex 
} 
2

などのチェックをすることはできません文字列の開始と終了を保証します。理論的には

let pattern = "^.{7}$" //allow exactly 7 numbers 
let regex = try! NSRegularExpression(pattern: pattern, options: [.caseInsensitive]) 
let numberOfOccurences = regex.numberOfMatches(in: input, options: [], range: NSMakeRange(0, input.utf16.count)) 
return (numberOfOccurences != 0) 

、我々はnumberOfOccurencesが1に真に等しい場合はtrueを返すために、しかし、開始と終了をチェックすると、あなただけ1またはゼロのマッチを与えるべきでチェックする必要があります。

+2

これは 'input.utf16.count'であることに注意してください.NSRangeはNSString内の文字(unichar)を数えます。 –

+1

@MartinRありがとう、固定;) – Larme

関連する問題