[[20240311162454]] 『正規表現のパターンを教えて』(クリーム) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『正規表現のパターンを教えて』(クリーム)

EXCELで
正規表現を使って、A列の

 <r\出発したいんだが> 

をB列に

 出発したいんだが 

に変更したい

 出発したいんだが

は、定型ではないので

 ここからここまで 

なども想定します。

該当する正規表現のパターンを教えてほしい

以下のようなコードを利用予定です。
    'パターン
    regexpattern =

      ' 
      Set regex = CreateObject("VBScript.RegExp")
      regex.Global = True
      regex.IgnoreCase = True
      regex.Pattern = regexPattern

            If regex.Test(cell.Value) Then
                  cell.Offset(0, 1).Value = regex.Replace(cell.Value, "")
            Else
                  cell.Offset(0, 1).Value = cell.Value
            End If

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


 Sub test()
     Dim regex As Object
     Dim regexpattern$
     'パターン
     regexpattern = "^<r\\(.*)>$"
     '
     Set regex = CreateObject("VBScript.RegExp")
     regex.Global = True
     regex.IgnoreCase = True
     regex.Pattern = regexpattern

     ’置換されていることを確認するテスト
     Debug.Assert regex.Replace("<r\出発したいんだが>", "$1") = "出発したいんだが"
     ' マッチしない場合は、そのままであることを確認するテスト
     Debug.Assert regex.Replace("出発したい", "$1") = "出発したい"

     'したがって↓でよいと思われる。
     'cell.Offset(0, 1).Value = regex.Replace(cell.Value, "$1")
 End Sub

 testを実行して、Debug.Assertでストップしない限りテストは成功していると考えることができます。

 複数回出現するなら、
     regexpattern = "<r\\(.*?)>"         '? は必須
 です。

(xyz) 2024/03/11(月) 16:52:31


回答ありがとうございます。

パターンが1行に複数回出現することはありませんが、

以下のように1行にパターン以外の文字列もあることもあり得ます。

  <r\出発したいんだが>,良いだろうか
  最初は、<r\ここからここまで>

そのため、パターンにヒットする部分のみ削除(""と置き換え)したいです。
(regex.Replace(cell.Value, "")

(クリーム) 2024/03/11(月) 18:32:35


 質問がわかりにくいです。以下が、どうなればいいのか希望結果を書いてください。

 <r\出発したいんだが>,良いだろうか
  最初は、<r\ここからここまで>
(もっと簡潔に) 2024/03/11(月) 18:56:58

 複数回出現するならと書きましたが、1回でももちろん有効です。
 regexpattern = "<r\\(.*?)>"
 cell.Offset(0, 1).Value = regex.Replace(cell.Value, "$1")
 の組み合わせを確かめて下さい。
(xyz) 2024/03/11(月) 19:14:50

回答ありがとうございます。

以下のように1行にパターン以外の文字列もあることもあり得ます。

>希望結果を書いてください。

返還前:

  <r\出発したいんだが>,良いだろうか

返還後:

  出発したいんだが,良いだろうか

返還前:

  最初は、<r\ここからここまで>

返還後:

  最初は、ここからここまで
 

>regexpattern = "<r\\(.*?)>"
>cell.Offset(0, 1).Value = regex.Replace(cell.Value, "$1")
>組み合わせを確かめて下さい。

以下、試した結果です。

返還前:

  <r\出発したいんだが>,良いだろうか

返還後:

  出発したいんだが,良いだろうか

変換OKです。

返還前:

  最初は、<r\ここからここまで>	

返還後:

  最初は、<r\ここからここまで>

変換されていません。

(クリーム) 2024/03/11(月) 19:36:03


 Sub test()
    Dim ptn$
    ptn = "<r\\(.+?)>"
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = ptn
        Debug.Print .Replace("<r\出発したいんだが>,良いだろうか", "$1")
        Debug.Print .Replace("最初は、<r\ここからここまで>", "$1")
    End With
 End Sub
(もっと簡潔に) 2024/03/11(月) 19:47:29

 再現しません。きちんと、
最初は、ここからここまで
 に置換することを確認しています。

 パターンを再確認してください。
 "^" が残っていませんか?

 不明なら、実行したコードを、そのままこちらにコピーペイストしてください。 
 手入力でなく。

(xyz) 2024/03/11(月) 19:50:00


 補足です。
 言うまでもないことですが、
 <r\ .....>
 などのほかに、
 <s\ .....>
 など、色々なパターンがあることが正規表現を使う前提です。
 "<r\" と ">" しかないのであれば、
 正規表現など使わずに、単にそれら二つの文字列を""に置換することで済みます。

 逆に、複雑な入れ子になっているとすれば、正規表現では対応できないことが知られています。

(xyz) 2024/03/11(月) 19:55:35


返事が遅くなりました。

>再現しません。
>パターンを再確認してください。

以下のコードを使用して試した結果が
「2024/03/11(月) 19:36:03」です。

<r\ここからここまで> の場合、Elseが選択されます。

Option Explicit

Sub test()

      Dim regex As Object
      Dim regexpattern$
      Dim i As Long
      Dim lc1 As Long
      Dim cell As Range

      '書き出し初期化
      Range("B:B").ClearContents

      'パターン
      regexpattern = "^<r\\(.*)>"
      '
      Set regex = CreateObject("VBScript.RegExp")

      regex.Global = True
      regex.IgnoreCase = True
      regex.Pattern = regexpattern

      lc1 = Cells(Rows.Count, "A").End(xlUp).Row

      ' A列の各セルをチェックしてパターンを削除
      For i = 1 To lc1
            Set cell = Cells(i, 1)

            If regex.test(cell.Value) Then
                  cell.Offset(0, 1).Value = regex.Replace(cell.Value, "$1")
            Else
                  cell.Offset(0, 1).Value = cell.Value
            End If
      Next i

End Sub

=========================================

>色々なパターンがあることが色々なパターンがあることが正規表現を使う前提です。

パターンが複数存在するので正規表現を利用したいと思います。
複雑な入れ子形式は、無いと思います。

(クリーム) 2024/03/12(火) 08:11:57


 (1)
 regexpattern = "^<r\\(.*)>"
 にある"^"というのは、「入力文字列の先頭に一致」と言う意味です。
 つまり、
 その文字列が<r\\(.*)>というパターン「で始まる」ことを意味します。
 したがって、
 最初は、<r\ここからここまで>
 は、そのパターン文字列で始まっているわけではないので、マッチしません。置換されません。
 私が記載したとおり、"^"は不要ですから削除して下さい。

 (2)
 ついでに申し上げると、
 regex.Replace(cell.Value, "$1")
 というのは、
     ・マッチした文字列の全体を
     ・サブマッチ文字列(マッチパターンにあるカッコで囲まれた部分のこと)
 で置き換えろ、という意味です。
 $1というのは、サブマッチ文字列を表す記号です。
 複数のサブマッチがあれば、$1,$2,...等が使えます。

 この結果、
 "<r\出発したいんだが>,良いだろうか"    ←元の文字列
 が
 "出発したいんだが"                     ←パターンでマッチしたときに"("と")"で囲まれた部分マッチ
 に置換されるのです。

 (なお、サブマッチ文字列は、別の呼び方があるかもしれません。
  SubMatches コレクション に保存されるのでこう呼びました。)

 (3)
 貴兄が最初に書いたコード
 regex.Replace(cell.Value, "")  では、
 削除すべき文字列にマッチするパターンにしなければならないわけです。
 その部分を削除したいのですから。

このあたりのことは、素人の講釈よりも、正規表現に関するテキストで確認するとよいと思います。
ある程度慣れる必要がある技術です。
(xyz) 2024/03/12(火) 08:42:04


回答ありがとうございます。

さいさん、"^"は不要だから削除するようにアドバイスされていたのに無視するようなコードで申し訳ないです。
"^"を削除して上手処理できました。

パターンが複数存在するで最初は、<r\\(.*)| <s\\(.*)| のように
| で区切っていずれかの文字列が存在した時に、正規表現に合致したので処理する事を考えましたが
| での区切りは、複数になるとパターンが長くなり見にくくなるので
他のシートのA列に正規表現の候補を一つずつ入れて
列単位で処理した方が見やすいし後で変更する場合も簡単だと思い変更したいのですが。

参考になるコードを教えてください。

ちなみに現在、以下をシート2のA列にINPU予定です。
{\an7}
{\an1}
<ruby>
</ruby>
<rt>
</rt>
<rt>・</rt>

(これから増えた分は以下に続く.......)

(クリーム) 2024/03/12(火) 09:52:31


 背景になる経緯とか全体的なタスクの目的を説明してください。
 細切れな情報を出されても困ります。こちらは下請けじゃないです。
 HTMLかなにかをプレーンなテキストに変更しようということですか?
 タグを""に変換するほうが早そうですね。

(xyz) 2024/03/12(火) 15:31:58


     Debug.Print Join(Application.Transpose([A1:A5]), "|")
 こうした書き方を参考にしてトライしてください。
 私はここまでとさせていただきます。
(xyz) 2024/03/12(火) 18:41:34

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.