Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
目的
リソースファイル内のダイアログリソースの表記ゆれを改善します。
記述を統一することにより、編集しやすくすることが狙いです。
経緯
ダイアログリソースのコントロールの記述が複数行に渡っているのをまとめる修正( #320 )のレビュー中に対応を提案。PRと関係ない話題なので別にリクエストを投げることにしました。
#320 (comment)
修正内容
単純化すると
s/,/, /
の変更です。普通に一括置換しようとすると引用符に囲まれたカンマまで処理してしまうので、前後に想定パターンを付けて誤って文字列内のカンマを置換してしまうことを防止しています。
置換パターン:
((?<!\\)"(?:[^\\"]|\\.)*"|\w+),(?: {2,})?(\w+|"(?:[^\\"]|\\.)*")
←内容は後述。置換後文字列;
$1, $2
一致箇所は、7,295+5,363+2で12,660箇所。
diffツール(WinMerge等)で空白の差分を無視する設定にすれば、
空白以外に差分がないことを確認できます。
置換パターン正規表現の説明
複雑な正規表現なので、内容の説明を付記します。
「先行パート、置換対象パート、後続パート」の3つのパートに分けてパターンマッチさせます。
正規表現はメタ文字で「キャプチャする/しない」を切り替えることにより、
置換時に変更したくない部分と変更したい部分を分けて考えられるようにしています。
※コメントに書いたときとパターンを変えてるので少し説明を変えています。
((?<!\\)"(?:[^\\"]|\\.)*"|\w+)
先行パート、キャプチャします。先行パートの構成物は 文字列か識別子 です。
否定戻り読み(?<!...)でエスケープされてない二重引用符を探してます。
文字列の中身は0個以上の文字ですがエスケープシーケンスは除外したいので複雑になってます。
,(?: {2,})?
置換対象パート、キャプチャしません。カンマの後に2個以上の半角空白があった場合はここにマッチします。
(\w+|"(?:[^\\"]|\\.)*")
後続パート、キャプチャします。後続パートの構成物は 識別子か文字列 です。
パフォーマンスを考慮して識別子を先に判定させます。
先行文字列が決まっているので戻り読みの部分が消えています。
確認方法
否定先読み(?!...)を使って、カンマの後にスペースがない文字列を検索し、
二重引用符に囲まれた部分以外の一致(=修正漏れ)がないことを確認しました。
その他参考
パターン検索をできるだけ簡単にするため、
前提としてマッチしないパターンを除外しています。
カンマの前に空白があるパターン
OR演算子の後に空白がないパターン
OR演算子の前に空白がないパターン
ダイアログスタイルのNOTの後が空白1個でないパターン