2012-06-25 76 views
10

我試圖確定正確的RegEx語法來執行以下操作。我在第一次出現空格之前想要匹配每個字符的文件中有一行。正則表達式 - 貪婪空格匹配

因此,例如在線路:

123ABC XYZ富巴

目前還不清楚我爲什麼以下幾點:

^.*\s 

中匹配了到B單詞欄:

123ABC XYZ富

在我看來,該\ s是貪婪的,但是我不能肯定我怎樣才能使它不貪心,只是匹配企圖使123ABC我已經嘗試了各種形式的這種正則表達式它非貪心^.*\s?或類似的東西,但我一直不成功。預先感謝您

+1

試試這個 - ?'^ * \ s'。在你的版本中,這個點是貪婪的 –

+0

這正是我想要的 - 謝謝你們兩個 - 我以爲我在做的是讓*點變得貪婪,直到它找到一個空格(用\ s),然後我會把該?在表明只匹配0次或更多次之後。我現在明白了 - 謝謝 – vloche

回答

16

那是因爲.可以是任何字符,包括空格。您可以嘗試

^[^ ]*\s 

^\S*\s 

代替。

這是一個貪婪的重新。但是你可以讓非貪婪重也:

^.*?\s 

你的錯誤是你放置?在錯誤的地方。

例子:

$ echo aaaa bbb cccc dddd > re.txt 
$ cat re.txt 
aaaa bbb cccc dddd 
$ egrep -o '^.*\s' re.txt 
aaaa bbb cccc 
$ egrep -o '^\S*\s' re.txt 
aaaa 
$ egrep -o '^[^ ]*\s' re.txt 
aaaa 

和非貪婪搜索用Perl:

$ perl -ne 'print "$1\n" if /^(.*?)\s/' re.txt 
aaaa 
+0

需要注意的是,每次這樣的比賽都會包含一個尾隨空格字符 –

+0

謝謝伊戈爾 - 您回答了我的第一個問題,關於RegEx的另外一個問題 - 謝謝 – vloche

+0

@vloche請考慮將此答案標記爲已接受 – ellockie

3

使用正則表達式^\S*(?=\s)

從一開始就意味着所有(*)非空白字符(\S) (^),但必須遵循空格字符(\s ),但不包括在比賽 - 如果你想尾隨空白(S)被列入以及積極超前(?=\s)

,然後用正則表達式^\S*\s+