正規表現で"ld"(^ld)にはマッチするが、"Build"にはマッチしないようなものはどのように書けばよいのか教えてください。



ldの前にi以外の文字の0個以上の繰り返しを置けばよいかと思いましたが、

echo Build |perl -le "$_=<STDIN>; print /[^i]?ld/;"

では真になります。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/05/13 01:19:44
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:GoldenDawn No.1

回答回数426ベストアンサー獲得回数81

ポイント100pt
/(?<!Bui)ld/

ではどうでしょうか。

id:foobar_777

Perlではできました。ありがとうございます。

sedやJAVA等でも使える一般的な正規表現では実現できないのでしょうか?

2009/05/13 00:29:28
id:angemaries No.2

回答回数80ベストアンサー獲得回数2

?が不要なだけでは?

perl -le "$_=<STDIN>; print /[^i]ld/;"

id:foobar_777

これだとld (ldより先に何もつけない)にもマッチしません。

ちなみに環境は以下のとおりです。

This is perl, v5.8.7 built for MSWin32-x86-multi-thread

2009/05/13 00:48:04
id:randk No.3

回答回数77ベストアンサー獲得回数4

ポイント10pt

てもとにらくだぼんないので完璧ではないですが・・・

>echo Build |perl -le "$_=<STDIN>; print /[^i]?ld/;"

echo Build |perl -le "$_=<STDIN>; print /[^i]ld/;"

でどうですかね?

文頭にldがあるときに真を返す必要がある場合はこれプラス

/^ld/

を条件に加える必要がありますが・・・。

id:foobar_777

ldの前になにか文字列がある場合にはおっしゃるとおりの正規表現でOKです。

今、手元にPerlがあるのでPerlでためしていますが、他の環境でも使いたいので

できれば、らくだ本に乗っているようなPerl独自の正規表現ではないほうがいいです。

2009/05/13 00:56:49
id:angemaries No.4

回答回数80ベストアンサー獲得回数2

ポイント100pt

行頭もありと記述されてましたね。見落としです。

perl -le "$_=<STDIN>; print/^[^i]*ld/;"

id:foobar_777

できました。どうもありがとうございます。

2009/05/13 01:17:46
id:rouge_2008 No.5

回答回数595ベストアンサー獲得回数351

ポイント10pt

以下でいかがでしょうか?

/^ld$/

「ld~」にもマッチさせたい場合は、「/^ld.*/」にします。

.(任意の文字)、*(0回以上の繰り返し)、^(行の先頭)、$(行の末尾)は、sedやJavaでも使えるようですから、おそらく大丈夫ではないかと思います。

http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231161/

http://www.site-cooler.com/java/j2se/regex.htm

  • id:pigment
    正規表現には方言があるのは当たり前なので、あちこちで動くことを想定するのには限界がありますよってことはご存知ですよね?
  • id:Craftworks
    Perl であれば、\b(単語境界)を使います。sed でも使えます。/\bld/

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません