Closed9

正規表現で調べたこと

akiGAMEBOY५✍🤖はれときどきZennakiGAMEBOY५✍🤖はれときどきZenn

▼Excel VBAで半角数値を判定するプロシージャを見直したときの参考記事

数値の正規表現

https://excel-ubara.com/excelvba4/EXCEL232.html
https://qiita.com/BlueSilverCat/items/f35f9b03169d0f70818b
↑以前、採用したが「a1234」や「1234a」が数値として返ってくる為、見直し。
https://www.wareko.jp/blog/how-to-use-minus-sign-of-range-specification-of-regular-expressions
https://webllica.com/javascript-number-check-function/
↑を採用。
http://www.kogures.com/hitoshi/javascript/reg-exp/number-string.html
↑未読。詳しく記載してあるので、後々読む。

akiGAMEBOY५✍🤖はれときどきZennakiGAMEBOY५✍🤖はれときどきZenn

▼ 部分置換:置換で置換前の一部文字をそのまま残す

通常、正規表現を使った置換を実施する際は、検索条件でマッチした文字列をすべて置換するが、
よくあるニーズとして置換する際に一部文字列だけ変更し置換する方法も可能。

検索条件内、残したい文字列を小かっこ(対象文字列)で囲みグループ化し、
置換条件で$n[1]を指定する。

置換後の入力情報で指定するメタ文字(メタキャラクター)のドルマーク($)は、テキストエディタによって違う。
例えば、VS Codeでは$を使用し、秀丸エディタでは\、サクラエディタでは$\両方とも使用可能など複雑。

置換前の文字列

C:\Users\YamadaA
C:\Users\YamadaA\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\Users\YamadaA\Desktop
C:\Users\YamadaA\Documents
C:\Users\YamadaA\Downloads
C:\Users\YamadaA\Music
C:\Users\YamadaA\Pictures
C:\Users\YamadaA\Videos

置換前の入力情報(検索条件)

(C:\\Users\\)YamadaA(.*)

置換後の入力情報(置換条件)

$1IchikawaA$2

置換後の文字列(置換結果)

C:\Users\IchikawaA
C:\Users\IchikawaA\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\Users\IchikawaA\Desktop
C:\Users\IchikawaA\Documents
C:\Users\IchikawaA\Downloads
C:\Users\IchikawaA\Music
C:\Users\IchikawaA\Pictures
C:\Users\IchikawaA\Videos

詳しい解決

C:\Users\YamadaA\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startupをピックアップして解説すると、
引数1で指定したC:\Users\は置換後もそのまま、
置換対象のYamadaAIchikawaA置換する
引数2で指定した\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startupは置換後もそのままとなる。

表にすると下記の通り。

引数1($1) 置換対象 引数2($2)
置換前 C:\Users\ YamadaA \AppData\Roaming\Microsoft\Windows\~ 省略 ~
置換後 C:\Users\ IchikawaA \AppData\Roaming\Microsoft\Windows\~ 省略 ~
脚注
  1. nはグループ数に応じた1以上の整数で指定 ↩︎

akiGAMEBOY५✍🤖はれときどきZennakiGAMEBOY५✍🤖はれときどきZenn

▼改行を含めた複数行のマッチする方法(VS Codeの場合)

置換前の文字列

~ 他の文字列 ~

How to
regular
expression.

~ 他の文字列 ~

この3行分のマルチラインで「to(改行)regular(改行)expression」のみをマッチさせたい場合、
何も考えず「to\r\nregular\r\nexpression」としたが、うまくいかなかった。

VS Codeの正規表現に限り、改行を含む複数行の文字列をマッチさせる方法があった。

検索時の入力情報(マッチ条件)

to[\s\S\n]*?expression

置換後の文字列(置換結果)


画像:VS Codeでは、正規表現で複数行の文字列をマッチ可能

参考情報:検索条件を少し変えると
  • *?expression」から「*?e」に変更すると
    • 検索時の入力情報(マッチ条件)
      to[\s\S\n]*?e
      
    • 置換後の文字列(置換結果)

      画像:検索条件を「*?e」に変えると、終点がもっとも近い「e」となる
  • *?expression」から「*e」に変更すると
    • 検索時の入力情報(マッチ条件)
      to[\s\S\n]*e
      
    • 置換後の文字列(置換結果)

      画像:検索条件を「*e」に変えると、終点がもっとも遠い「e」となる

参考情報

  • VS Codeでのやり方
    https://qiita.com/officemove/items/a6caa20c978197eaff50
  • サクラエディタでは複数行不可
    https://sakura-editor.github.io/bbslog/sf/general/7525.html
    VS Codeのように一度でマッチする事はできないが、段階を踏むことで実現可能。
    方法は、改行コードをテキスト内に登場しない文字列[例では|(縦棒)]に、
    置き換える事でマッチ可能な方法あり。
    サクラエディタで段階を踏んでマッチさせる方法

    用途によって手順は変わりますが、単純に対象の文字列を抜粋したいだけであれば、
    下記の方法により実現可能です。

    1. 改行コード「\r\n」を「|(縦棒)」に変換
    2. 検索条件を「to\|regular\|expression」で検索
    3. 検索しヒットした文字列を抜粋
    4. 抜粋した文字列を対象に最後に「|(縦棒)」から改行コード「\r\n」に戻す
akiGAMEBOY५✍🤖はれときどきZennakiGAMEBOY५✍🤖はれときどきZenn

▼Notion - テーブル から Markdown記法 - テーブル に変換する方法

Notionのテーブルをテキストエディタにコピペすると、Markdown記法のテーブルではなく、
タブ(\t)区切りのデータが貼り付けられた。

ざっくり調べた限りだと簡単にMarkdown記法のテーブルに変換できそうになかったので、
正規表現を使った置換と若干の手作業で変換できたので変換方法をメモ。

変換対象の文字列

変換前[タブ(\t)区切り]
自動変数名	データ型
[自動変数.GetType().FullNameコマンド]
$$	System.String
$?	System.Boolean
$^	System.String
$_($PSItem)	エラー(nullだった)
* パイプラインで渡ってくるオブジェクトにより変化する
$args	System.Object[]

変換手順

置換はVS Codeで実施。サクラエディタなどのテキストエディターでも同じように対応可能。

  1. 置換を実行

    • 置換条件
      検索条件:[^(.*)\t(.*)$]
      置換文字:[| $1 | $2 |]
      置換オプション:正規表現の使用をON
    • 置換後の文字列
      置換後
      | 自動変数名 | データ型 |
      [自動変数.GetType().FullNameコマンド]
      | $$ | System.String |
      | $? | System.Boolean |
      | $^ | System.String |
      | $_($PSItem) | エラー(nullだった) |
      * パイプラインで渡ってくるオブジェクトにより変化する
      | $args | System.Object[] |
      
  2. セル内で複数行の文字だった箇所を手作業で修正

    セル内で複数行の文字だった箇所を手作業で修正
    - | 自動変数名 | データ型 |
    - [自動変数.GetType().FullNameコマンド]
    + | 自動変数名 | データ型<br>[自動変数.GetType().FullNameコマンド] |
    | $$ | System.String |
    | $? | System.Boolean |
    | $^ | System.String |
    - | $_($PSItem) | エラー(nullだった) |
    - * パイプラインで渡ってくるオブジェクトにより変化する
    + | $_($PSItem) | エラー(nullだった)<br>* パイプラインで渡ってくるオブジェクトにより変化する |
    | $args | System.Object[] |
    
  3. 一部箇所をMarddown記法に置き換え
    見出し下にMarkdown記法の「 | ---- | 」を追加。

    一部箇所をMarddown記法に置き換え
    | 自動変数名 | データ型<br>[自動変数.GetType().FullNameコマンド] |
    + | ---- | ---- |
    | $$ | System.String |
    | $? | System.Boolean |
    | $^ | System.String |
    | $_($PSItem) | エラー(nullだった)<br>* パイプラインで渡ってくるオブジェクトにより変化する |
    | $args | System.Object[] |
    

最終結果

変換後(Markdown記法 - テーブル)
| 自動変数名 | データ型<br>[自動変数.GetType().FullNameコマンド] |
| ---- | ---- |
| $$ | System.String |
| $? | System.Boolean |
| $^ | System.String |
| $_($PSItem) | エラー(nullだった)<br>* パイプラインで渡ってくるオブジェクトにより変化する |
| $args | System.Object[] |
akiGAMEBOY५✍🤖はれときどきZennakiGAMEBOY५✍🤖はれときどきZenn

▼HTMLやMarkdownで複数行ではなく1行ずつコメントアウトする置換方法

置換するイメージ

元の文字列
1行目
2行目
3行目
複数行のコメントアウト(これではなく)
+ <!-- 
1行目
2行目
3行目
+ -->
1行毎にコメントアウト(これでコメントアウトしたい場合)
- 1行目
+ <!-- 1行目 -->
- 2行目
+ <!-- 2行目 -->
- 3行目
+ <!-- 3行目 -->

コメントアウト状態に置換する方法

VS Codeを使用しました。

  1. 対象の文字列を範囲選択
  2. 置換を起動(Ctrl + H)
  3. 置換オプションの変更
    • 大文字と小文字を区別(Alt + C)
    • 正規表現を使用する (Alt + R)
    • 選択範囲を有効をオン(Alt + L)
  4. 置換条件を設定
    • 検索条件
      ^(.*)$
    • 置換文字
      <!-- $1 -->
  5. 置換の実行

コメントアウト解除状態(アンコメント)に置換する方法

  1. 対象の文字列を範囲選択
  2. 置換を起動(Ctrl + H)
  3. 置換オプションの変更
    • 大文字と小文字を区別(Alt + C)
    • 正規表現を使用する (Alt + R)
    • 選択範囲を有効をオン(Alt + L)
  4. 置換条件を設定
    • 検索条件
      ^<!-- (.*) -->$
    • 置換文字
      $1
  5. 置換の実行
akiGAMEBOY५✍🤖はれときどきZennakiGAMEBOY५✍🤖はれときどきZenn

▼連続したスペースをマッチさせる方法

正規表現 やっていること
[␣].*[␣] ①先頭のスペースと後方のスペースを指定
␣.*␣ 上記の大括弧を省略版
[␣]+ ②スペースが1以上続く場合
␣+ 上記の大括弧を省略版
\x20.*\x20 ①の文字コードで置き換え版
\x20+ ②の文字コードで置き換え版
[␣]{3,} ③3つ以上のスペースの場合
␣{3,} 上記の大括弧を省略版
  • 表内のは半角スペースに置き換えて読むこと。

実践:連続した半角スペースを1つの半角スペースに置き換え

https://pasomaki.com/sakuraeditor-continuous-space-summarize/

akiGAMEBOY५✍🤖はれときどきZennakiGAMEBOY५✍🤖はれときどきZenn

▼1行に検索条件の文字列が複数個あり個々の文字列毎にヒットさせる方法

https://www.w2solution.co.jp/corporate/tech/eg_tk_tk_seikihyogen2/

  • テキスト内容
    | ![](https://xxxx.com/xxxx) | ![○○の画像](https://xxxx.com/xxxx) |
  • 期待値
    "!["から始まり次に登場する")"までの文字列をヒットさせたい
    →検索ヒット1件目「![](https://xxxx.com/xxxx)
     検索ヒット2件目「![○○の画像](https://xxxx.com/xxxx)
  • ダメな検索条件
    !\[.*\(http.*\)
     →最初の"!["から最後の")"までの全体の文字がヒットしてしまう
  • 期待通りはたらく検索条件
    !\[.*?\(http.*?\)
     →正規表現"*"の後ろに"?"を付与する事で最小マッチ(条件に合う最も短い範囲)で設定できた
このスクラップは2023/03/14にクローズされました