2011-07-29 65 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这样的东西有效。事实上,任何事情都可行,所以如果你想要在“美国”之前的单词/数字,那么这是写它的方式。
  • 接下来是向前看。所以你只需要紧跟着“美国”的捕获组。如果发现它,它只会让您返回捕获组,而不是先行值。