質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

2回答

646閲覧

正規表現について(肯定先読み・肯定戻り読み)

qwerting

総合スコア1

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/09/03 20:01

正規表現について、、、

以下の数式において、xの係数(14)を正規表現で抜き出したいです。
「y=5x**2+14x+17」

最初は、肯定戻り読み・否定戻り読みを以下のように設定しました。(以下は正しくないです/失敗)
(?<=[=|+|-])\d*(?!x*)

これだと動作しません、、、
数値判定の桁を指定せずに(\dの後のを削除して)
(?<=[=|+|-])\d(?!x
)

だと動くのですが桁数が正しく設定されないため不可です。

最終的に、
(?<=[=|+|-])\d+(?!x*)
で動いたのですが、
+ではokで、*では正しく動かない理由を知りたいです。

*は最長マッチングでokだと自分的には思っていたんですけど、、、

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/09/03 23:47

(?<=[=|+|-]) → '=', '|', '+', '-' のいずれかの後の位置にマッチ (?!x\*) → x* の前でない位置にマッチ \d* → 0 文字以上の数字にマッチ つまり、'=', '|', '+', '-' のいずれかの後で、x* の前でない位置にある 0 文字以上の数字にマッチします。 この中で一番前にあるのは、y= の後の 0 文字の数字です。(5 は x* の前にあるためマッチしません) \d* を \d+ にした場合は確かに 14 にマッチしますが、正規表現の意味を考えると偶然に近いものに思えます。たとえば 5 のところが 10 であれば 14 にはマッチしません。
guest

回答2

0

「正規表現チェッカー」で検索して出てくるページで試せば、理由が理解できるのではないでしょうか。

最初の正規表現だと、「y=」と「5x**2+14x+17」の間の長さ0の文字列もマッチしてしまいます。

(?!x*)という正規表現ですと、次がxでなければ何でもマッチしてしまいます。
(?=x(?!*))のように、次がxであることを確認したうえで、
さらにその次が*でないことを確認すべきでしょう。

投稿2021/09/03 21:13

編集2021/09/03 21:24
actorbug

総合スコア2429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何が起こっているかは、perlで試してみると分かります。

perl

1# test.pl 2 3$a = 'y=5x**2+14x+17'; 4print qq{target: "$a"\n}; 5 6$a=~/(?<=[=+-])\d+(?!x*)/ 7 and print qq{hit: "$&" after "$`" before "$'"\n}; 8# $&, $` $'は、正規表現にマッチした文字列、その前の文字列、その後ろの文字列がそれぞれ入る特殊変数 9 10$a=~/(?<=[=+-])\d*(?!x*)/ 11 and print qq{hit: "$&" after "$`" before "$'"\n};
$ perl test.pl target: "y=5x**2+14x+17" hit: "14" after "y=5x**2+" before "x+17" hit: "" after "y=" before "5x**2+14x+17"

うまく行かなかった方の正規表現の\d*は、ゼロ文字以上の数字にヒットするので、空文字列にヒットしてしまっています。

質問とは関係ないことですが、正規表現の[]の中に|を書く必要はありません。

投稿2021/09/03 22:43

KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問