2011-07-29 68 views
0

之前,我有一個像正則表達式匹配3個字符匹配

文字文字文字3424文本文本3423 美國50文本342文本

我想配什麼是行的文件50 US(是的,美元)並最終提取該數字。 其他所有內容都會在不同的行中發生變化,可能會有更多的文字或更少的周圍,但是在每行中只有一個可以匹配的「US」錨點。

所以我想要做的是找到一種方法來匹配US並獲得前面的3或4個字符。

任何想法?最好用sed/awk,但任何解決方案都可以。

回答

1

Perl的正則表達式(或任何理解非貪婪.*?表達式)相比,是容易的sed此:

perl -pe 's/^.*?(\d+\.?\d*)\s*US.*$/$1/' 

將處理像「11.23」,以及東西。

+0

我正準備發佈我自己的解決方案,像'grep -o「[[:digit:]] \ {1,3 \} US這樣的醜陋的東西」file | cut -d 「」-f 1「,但你的顯然更好。謝謝! –

0
\d+ US 

這應該工作,因爲美國只在字符串中出現一次。

+0

我不認爲這將適用於「2000美國」或「2.99美國」 –

+0

同意!它不會在這些情況下工作:) –

0

使用lookarounds

\d+(?= US) 

此正則表達式將只捕獲數字量。 (?= US)告訴它匹配「美國」,但不捕獲它。

0

這是你可以在VBA正則表達式的味道,這也支持向前看符號用什麼:

" ((.+)(?= US))" 
  • 開始於一個空間
  • 接下來是捕獲組。 (。+)我使用它來代替\ d,使得像5,000和11.3這樣的東西有效。事實上,任何事情都可行,所以如果你想要在「美國」之前的單詞/數字,那麼這是寫它的方式。
  • 接下來是向前看。所以你只需要緊跟着「美國」的捕獲組。如果發現它,它只會讓您返回捕獲組,而不是先行值。