アプリ版:「スタンプのみでお礼する」機能のリリースについて

任意文字数のアルファベット+任意桁数の数値で構成された
単語にのみ部分マッチする正規表現を教えてください。
条件は、前に数字が無いこと、または、後ろにアルファベットが無いことです。


例えば、

  23*ade3456,ad-r4+4er3456=pol34k#gtu34&-de23knm723a3
この場合、

 ade3456
 r4
 gtu34

に、マッチして欲しいのです。

 4er3456
これは、手前に数字があるのでマッチしてはいけません。
 pol34k
こちらは後ろにアルファベットが続いているのでマッチしてはいけません。
 de23knm723a3
これはどこで切っても条件を満たしません。

以上、よろしくお願いいたします。

A 回答 (3件)

こんにちは。

No.2のものです

コツとしては
「ほしいものを厳密に表現しましょう」
です。

ggable様の考える、「任意文字数のアルファベット+任意桁数の数値で構成された単語」は
 [a-zA-Z]+[0-9]+
ではなく、
 (?<![a-zA-Z])[a-zA-Z]+[0-9]+(?![0-9])
であることが、サンプルから読み取れました。

これに2つの条件を加えまして・・・
 (?<![0-9])(?<![a-zA-Z])([a-zA-Z]+[0-9]+)(?![0-9])(?![a-zA-Z])

このままでもいいのですが、まとめてすっきり、
 (?<![0-9a-zA-Z])([a-zA-Z]+[0-9]+)(?![0-9a-zA-Z])

という感じです
    • good
    • 0
この回答へのお礼

ありがとうございました。

”ご説明頂いてすっきりしました”といいたいところですが、
なかなか奥が深くてすっきりするまでには至っておりません。
しかしながら、基本的な考え方も知らなかった私には、
とても勉強になりました。

また、同等な質問を繰り返してしまうかもしれませんが、
今後ともよろしくお願いいたします。
お世話になりました。

お礼日時:2009/08/14 09:34

こんにちは



$_ = "23*ade3456,ad-r4+4er3456=pol34k#gtu34&-de23knm723a3";

@a = /(?<![0-9a-zA-Z])([a-zA-Z]+[0-9]+)(?![0-9a-zA-Z])/g;
print join("\n", @a);

この回答への補足

ご回答ありがとうございました。
ご指摘の通りでうまくいきました。

私の発想では、手前に数字が無いこと
 ?<![0-9]
と、後ろにアルファベットが無いこと
 ?![a-zA-Z]
を組み合わせて、
 (?<![0-9])([a-zA-Z]+[0-9]+)(?![a-zA-Z])
で、うまくいくと思っていたのですが...

どういう風に考えれば、
 ?<![0-9a-zA-Z]
 ?![0-9a-zA-Z]
という条件を発想できるのでしょうか?
ご指導頂ければ幸いです。

補足日時:2009/08/13 21:28
    • good
    • 0

こんにちわ。



サクラエディタの機能でちょこっと試してみた程度ですが

([a-zA-Z]+[0-9]+)

でいけるのでは?
23*「ade3456」,ad-「r4」+4「er3456」=「pol34」k#「gtu34」&-「de23knm723a3」
になりましたよ
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!