C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 正規表現「先読み」


(過去ログ 170 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■98043 / inTopicNo.1)  正規表現「先読み」
  
□投稿者/ maru (1回)-(2021/09/01(Wed) 10:56:12)

分類:[.NET 全般] 

正規表現の学習をしているのですが、理解が及ばない点があるので教えてください。
「肯定先読み(?=)」と「否定先読み(?!)」で躓いています。

お題として、「A1」と「1A」という2つの文字で考えます。

(1)最初に「文字全体」を先読みで「数字」+「数字以外」かチェック。(「1A」のみ合格)
(2)↑に成功すれば「数字」を取り出す。

本来、「肯定:\d+(?=[^\d]+)」や「否定:\d+(?!\d+)」でいいと思いますが、最初に「文字全体」をチェックして
これに合格しないと、「その時点でマッチなし」という表現を考えています。

現在の私の理解を日本語で書きます。

●「肯定先読み(?=)」の場合:(?=^\d+[^\d]+$)\d

(1)(?=^\d+[^\d]+$)で「対象文字列全体」が 「数字」+「数字以外」かチェック
(2)↑で「A1」は、はじかれ「1A」のみが対象
(3)続く「\d」で「1A」の「1」のみ得られる。

こちらは、想定通りです。

●「否定先読み(?!)」の場合:(?!^[^\d]+\d+$)\d の場合の理解が及びません。

(1)(?!^[^\d]+\d+$)で「対象文字列全体」が NOT(「数字以外」+「数字」)かチェック
(2)↑で「A1」は、はじかれ「1A」のみが対象
(3)続く「\d」で「1A」の「1」のみ得られる。

しかし、結果は「A1」「1A」共、マッチします。
先読みが「位置」にマッチするという事は理解しております。
「A1」の場合、「(?!^[^\d]+\d+$)」がマッチなしで、パーサが先頭位置のままで、続く「\d」で「1」を
拾っているのだと思いますが、この理解だと「肯定先読み」の(?=^\d+[^\d]+$)が説明つきません。

私の理解の間違っている点を、教えてもらえないでしょうか?
引用返信 編集キー/
■98044 / inTopicNo.2)  Re[1]: 正規表現「先読み」
□投稿者/ furu (125回)-(2021/09/01(Wed) 12:08:52)
No98043 (maru さん) に返信
肯定先読み,否定先読みを初めて知りました。

データベースのSQLでもプログラム言語でも
否定(not)は思ったように逆にならず難しいですよね。

やってみましたけど、同じ結果でした。

WEBでちょっと肯定先読み,否定先読みを見ただけですけど
そもそも使い方が間違っているような気がします。

・先読みだと()は後ろに書かれている。
・()内に^は使われていない。
引用返信 編集キー/
■98045 / inTopicNo.3)  Re[1]: 正規表現「先読み」
□投稿者/ 魔界の仮面弁士 (3171回)-(2021/09/01(Wed) 13:30:45)
2021/09/01(Wed) 14:55:35 編集(投稿者)

# 訂正。5 パターンじゃ無くて 6 パターンだった。

No98043 (maru さん) に返信
> 正規表現の学習をしているのですが、理解が及ばない点があるので教えてください。

https://weblabo.oscasierra.net/tools/regex/

の『検証対象文字列』に「1A{改行}A1」という 2 行を記述してみてください。


その上で『正規表現』欄に対して下記の 6 パターンを記してみると、状況を把握しやすいと思います。

(?=^\d+[^\d]+$)
(?=^\d+[^\d]+$)\d
(?=^\d+[^\d]+$)[^\d]

(?!^[^\d]+\d+$)
(?!^[^\d]+\d+$)\d
(?!^[^\d]+\d+$)[^\d]
引用返信 編集キー/
■98048 / inTopicNo.4)  Re[2]: 正規表現「先読み」
□投稿者/ maru (2回)-(2021/09/01(Wed) 14:56:32)
皆様、ありがとうございます。
魔界の仮面弁士様の提示URLで理解できました。(つもり)


否定「(?!^[^\d]+\d+$)」の場合「^」が効いて、それの「NOT」なので、
「A|1|」「|1|A|」の位置もマッチとなる。
*マッチ位置を「|」で表示しています。

このように理解しましたが、合ってるでしょうか?

引用返信 編集キー/
■98053 / inTopicNo.5)  Re[3]: 正規表現「先読み」
□投稿者/ 古谷 (9回)-(2021/09/02(Thu) 11:32:01)
No98048 (maru さん) に返信

合ってる!と思った!
引用返信 編集キー/
■98055 / inTopicNo.6)  Re[4]: 正規表現「先読み」
□投稿者/ maru (3回)-(2021/09/02(Thu) 12:04:29)
No98053 (古谷 さん) に返信

古谷様、ありがとうございます。

否定の場合は、思わない箇所にマッチする事があり、私のスキルで実務で使うには
バグの温床となるような印象を持ちました。
もっと学習して、自信を持って使えるよう精進いたします。

皆様、どうもありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -