Swiftで文字列に特殊文字が含まれているか判定する2つの方法
Swiftで文字列に特殊文字が含まれているかどうかを確認したい場合、if文やswitch文による条件分岐でも実現できますが、その場合は膨大な条件式を記述する必要があり、コーディングにも実行速度にも大きな負担となってしまいます。そこで本記事では、正規表現を使う方法と、Swift標準のCharacterSetを活用する方法の2通りを、具体的なコード例とともにわかりやすく解説します。
方法1:正規表現を使って判定する
まずはString型のextensionを作成し、特殊文字の有無を判定するプロパティを追加しましょう。
extension String {
var containsSpecialCharacter: Bool {
let regex = ".*[^A-Za-z0-9].*"
let testString = NSPredicate(format:"SELF MATCHES %@", regex)
return testString.evaluate(with: self)
}
}
このコードでは、パターン「.*[^A-Za-z0-9].*」を定義しています。これは「英数字以外の文字が1つ以上含まれている」ことを意味し、NSPredicateが対象の文字列を評価してBool値を返します。
実際の使い方は以下のとおりです。
override func viewDidLoad() {
super.viewDidLoad()
print("3r42323".containsSpecialCharacter)
print("!--%332".containsSpecialCharacter)
}
出力結果
方法1の実行結果は以下のとおりです。

続いて、方法2で同じ処理を実装してみます。
方法2:CharacterSetを使って判定する
まず、許可する文字(半角英数字)だけで構成されるCharacterSetを定義し、それを反転(inverted)させることで「特殊文字の集合」を作成します。あとはrangeOfCharacter(from:)を使って、反転した集合に該当する文字が存在するかどうかを調べるだけで、特殊文字の有無を簡単に確認できます。
let characterset = CharacterSet(charactersIn:
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
)
if "3r42323".rangeOfCharacter(from: characterset.inverted) != nil {
print("true")
} else {
print("false")
}
if "!--%332".rangeOfCharacter(from: characterset.inverted) != nil {
print("true")
} else {
print("false")
}
出力結果
実行結果は以下のとおりです。

まとめ
どちらの方法でも、文字列に特殊文字が含まれているかどうかをシンプルに判定できます。単純な英数字チェックならCharacterSet方式が直感的で高速ですが、「特定の記号のみを検出したい」「より柔軟なパターンマッチングを行いたい」といったケースでは正規表現の方が適しています。用途に応じて両者を使い分けることで、効率的かつ保守性の高いコードを実現できるでしょう。
-
Swiftで文字列が別の文字列を含んでいるか確認する方法
Swiftである文字列に別の文字列が含まれているかどうかを確認するには、2つの異なる文字列が必要です。1つは検索対象となる文字列、もう1つはその中に特定の文字列が含まれているかを調べる元となる文字列です。 ここでは、確認したい文字列を「point」、全体の文字列を「TutorialsPoint」、そして別の文字列として「one two three」を使用して説明します。Playgroundでこれらの文字列を使って実際に確認してみましょう。 この確認は、以下に示す2つの方法で行うことができます。まずは3つの異なる文字列を作成します。 var completeStr1 = Tutorials po
-
【Python】文字列がすべてユニークな文字で構成されているか判定する方法
本記事では、与えられた文字列に含まれる文字がすべて一意(ユニーク)であるかどうかを判定するPythonプログラムについて、その解法とアプローチをわかりやすく解説します。 問題の概要 文字列が入力として与えられたとき、その文字列に含まれるすべての文字が重複なく一意であるかどうかを判定します。たとえば「abcde」はすべて異なる文字で構成されているためTrue、「tutorialspoint」のように同じ文字が複数回出現する場合はFalseとなります。 アプローチ この問題は、以下のような手順で効率的に解くことができます。 ブール値の配列を用意する: 各インデックス i が「アルファベット(AS