2011-10-18 11 views
0

長い文字列。空白で区切られた単語を含み、そのうちの1文字は$ somevarで終わります。 シンプルなバージョンは、(xは$ SOMEVARがある)である:expr文字列を使用しています:文字列を切り詰める正規表現

expr "abc aac bbcx" : '.*\([^ ]\+x\).*' 

問題があり、それが唯一の "CX" を返します。それは "bbcx"を返します。ここで何が間違っていますか?

+0

私は私の友人をフォローしていません。 。* \([^] \ + x \)。*は入力文字列と一致しません。 – FailedDev

+0

@FailedDev私は '+'メタキャラクターが使えないことを覚えている限り、 "廃止RE"や基本RE(BSDとDarwin/MacOSは私が知っている2つのシステム)を使っているシステムでは、 '{1、}'や '\ {1、\}'のようなものを試してみて、 're_format(7)'のマニュアルページを確認してください。 – sidyll

+1

@Łukasz、これは、発生した最初のアトム( '。*')がすべて一致するためです。そして、正規表現を続けることはできないので、式を満たすために '[^]'のマッチまでバックトラックし、そこからマッチを続けます。それは有効ですが、あなたが本当に望んでいるのは、冒頭の貪欲でない原子です。しかし、それを行う方法はわかりません。これは、一般に、OSと一連のツールに大きく依存します。 GNU/Linuxを使用していますか? (ちょうどアバターによって推測:-) – sidyll

答えて

1

を*は貪欲である - それは、できるだけ多くの文字に一致します。 。*に変更します。

.*?([^ ]+x).*? 
0

は、次の正規表現試すことができます:[^\s]+x\b

0
kent$ echo "abc aac bbcx"|grep -Po "[^\s]+(?=x)"                       
bbc 

は 'X' あまりにもあなたが必要な場合:あなたはそれら

1は$ SOMEVAR

を終了言及し、それができる限り少数を一致させるために
kent$ echo "abc aac bbcx"|grep -Po "[^\s]+x(?=\s|$)" 
bbcx 

kent$ echo "abc aacx bbc"|grep -Po "[^\s]+x(?=\s|$)" 
aacx