概要
SPM(Swift Package Manager)で分割したパッケージ内でRegexを使った正規表現を記述しようとしたところ、以下のエラーが発生しました。
'/' is not a prefix unary operator
この問題とその解決策について備忘録として記録します。
なお、コード自体はPlaygroundsなどで正常に動作することを確認しており、コードそのものに問題はありませんでした。
原因
このエラーの原因は、SPMではデフォルトでbare-slash literal syntax
(スラッシュ区切りの正規表現リテラル構文)が無効になっているためです。
この構文は、スラッシュ(/)を正規表現リテラルの開始として解釈しますが、既存コードとの互換性を保つためにデフォルトでは無効化されています。例えば、/はコメントや除算演算子としても使われていますが、それらが正規表現として解釈されてしまう恐れがあります。
解決策
この問題を解決するには、以下の2つの方法があります。それぞれのメリットや適したケースを解説します。
方法1: try Regex()を使用する
1つ目の解決策は、try Regex()
を使って明示的に正規表現を初期化する方法です。これは、bare-slash literal syntax
を使用せずに正規表現を記述できるため、設定変更なしで利用可能です。
サンプルコード
let runtimeString = #"\d+"# // 正規表現パターンを文字列として定義
let digits = try Regex(runtimeString) // パターンから正規表現を初期化
メリットと注意点
-
メリット: 設定変更不要で、正規表現をシンプルに利用可能。既存のプロジェクトやライブラリに影響を与えない。
-
注意点: 初期化時にエラーハンドリングが必要なため、少し冗長。
この方法は、アプリ内で正規表現の利用頻度が低い場合や、設定を変更したくない場合に適してると思います。
方法2: Package.swiftに-enable-bare-slash-regexを追加する
2つ目の解決策は、Package.swiftに-enable-bare-slash-regex
フラグを追加し、SPMでスラッシュ区切りの正規表現リテラルを有効化する方法です。
設定方法
以下のコードをPackage.swiftに追加してください
for target in package.targets {
target.swiftSettings = target.swiftSettings ?? []
target.swiftSettings?.append(
.unsafeFlags([
"-Xfrontend", "-warn-concurrency",
"-Xfrontend", "-enable-actor-data-race-checks",
"-enable-bare-slash-regex",
])
)
}
メリットと注意点
-
メリット: スラッシュ区切りで正規表現を記述できるため、より簡潔でエラーハンドリングも不要。特に正規表現を頻繁に利用する場合に便利。
-
注意点: .unsafeFlagsを使用するため、慎重に使う必要がある。
この方法は、正規表現を頻繁に使用する場合や、コードを簡潔に保ちたい場合に適しています。
どちらを選ぶべきか?
-
正規表現を少しだけ使う → 方法1:
try Regex()
-
正規表現を多用する → 方法2:
-enable-bare-slash-regex
利用頻度やプロジェクトの方針に応じて適切な方法を選ぶといいと思います。