2014-10-01 74 views
2

我希望第一個非捕獲組不貪婪?

樣品後去除一切:

Yes – No – No – No 
Yes – No – No & No – No 
Yes Yes – No & No – No 
Yes – No – No & No 
Yes – No 
Yes – No – No 

正則表達式我使用:

/(.+) (?:– .+)/ 

比賽:

`Yes – No – No` 
`Yes – No – No & No` 
`Yes Yes – No & No` 
`Yes – No` 
`Yes` 
`Yes – No` 

好像非捕獲組是懶惰而不是貪婪?

我期望的結果是:

`Yes` 
`Yes` 
`Yes Yes` 
`Yes` 
`Yes` 
`Yes` 

回答

2
(.+?) (?:– .+) 

這將給所需result.Your正則表達式(.+) (?:– .+)是不正確的.+將嘗試停止之前儘可能多的字符地匹配,所以它會在最後-停止。相反,使用.+?使其懶惰。

http://regex101.com/r/hS3dT7/3

1

其實它的貪婪,這是問題的第一(捕獲)組。正則表達式引擎將首先嚐試填充模式的最左側部分。嘗試使第一組懶:

/(.+?) (?:– .+)/ 

在另一方面,你真的不需要第二位一組,無論如何,並且可以只捕捉到第一個-(帶有可選的空格前)和用它做:

/^(.*?)\s*-/ 

或者,如果你不關心空白或想以後修剪,它只是:

/^([^-]*)/ 
0

使用正則表達式如下,並刪除匹配字符串。

^[^–]*\K\s+–.* 

DEMO

0

另一種簡單的解決方案,雖然它不是在生產代碼推薦的,因爲如果字符串包含連續的空格,但沒有破折號長連勝可能招致的性能損失。 (當您編寫[ \t]+$刪除尾隨空格和製表符時,也會發生同樣的問題)。

搜尋與此正則表達式(分隔/爲了清楚起見添加):

/ *–.*/ 

並與空字符串替換。

DEMO

的想法很簡單。我們只搜索第一個破折號,它可能以空格開頭,然後將它們和其後的所有內容一起刪除。