2012-04-11 103 views
1

我想學習一些關於正則表達式,任何人都可以向我解釋這裏發生了什麼?並舉例說明一個可以提供預期輸出的正則表達式?謝謝!這個貪婪的正則表達式爲什麼不按預期工作?

input data = 'Sometext|even more text' 

regex = '(.*)?\|?.*' 

replacement = '$1' 

expected output = 'Sometext' 

actual output = 'Sometext|even more text' 

PHP

preg_filter("(.*)?\|?.*", "$1", 'Sometext|even more text'); // returns Sometext|even more text 
+1

請爲您添加PHP代碼。 – hakre 2012-04-11 14:08:50

+0

'\ |?'也使垂直條可選。 – nickb 2012-04-11 14:11:51

回答

1

(.*)是貪婪的,所以一切都匹配。 $1就是一切。

您可能正在尋找:

/^([^|]*).*$/ 
+0

什麼是非貪心(。*)的樣子? – netbrain 2012-04-11 14:11:30

+1

@netbrain:'(。*?)'但最好避免匹配所有運算符,而是排除你不想匹配的字符,如@hakre所做的。 – 2012-04-11 14:12:02

+1

你可以通過添加一個'?'使它變得非貪婪。但是,我編輯了答案,因爲你不想理解,但只是有代碼;) – hakre 2012-04-11 14:12:17

1

你的正則表達式時說:「所有的字符,後面跟着一個可選|,其次是0個或更多字符」。

將初始(.*)更改爲([^\|]*)或使|爲非可選。

1

*是貪婪的,這意味着它會盡量匹配儘可能多的文本。在這種情況下:

  • (.*)?將匹配所有文字
  • \|?.*將匹配 「休息」(空字符串)

嘗試:regex = '\|[^|]*', replacement = ''

1

如果你改變你的正則表達式來(\w+)?\|?.* ,特別是在\w之後加上+,那麼你會得到'Sometext'的預期答案。

您將整個字符串匹配的原因是第一個.*匹配整個字符串。通過上面所做的更改,您可以匹配任何單詞字符。