2014-01-05 21 views
0

我花了最後4個小時試圖找出如何編寫一些正則表達式,但每當我認爲我得到它,我的測試失敗... 任何人都可以幫助我或給我一些線索讓我走上正軌?我有一個在我面前的cheatsheet。找不到正確的正則表達式

我想要以下內容:一個正則表達式,給我的每一個字都有一個字符串,它有一個?它。

例子:this is a? example sentence? to test the regex?
我想asentenceregex的結果。

我想出的最好的正則表達式是/\w\?/

+3

你有什麼最好的? –

+1

最好的是//w \?/但這個ony給一個人物帶?不是整個單詞.. – user3156386

回答

4

一個天真的正則表達式,僅認爲是完全由ASCII字母最多可以

\b[A-Za-z]+(?=\?) 

\bword boundary anchor可以確保整個單詞匹配,和(?=\?)lookahead assertion斷言是有問題的話隨後立即標記下面的內容,而不是使該問號部分匹配。

+1

第二個'\ b'是多餘的:) – HamZa

2

我想說,首先,你可以定義一個詞作爲\S+(你沒有定義一個單詞,所以我只會去那個,改成其他的東西,比如更受限制的角色類,如果你想要的話到,可能類似\w+),或者甚至可能是\b\S+\b

由此,您需要檢查?,這可以通過積極的預測(?= ...)來完成。

現在,你可以從(?=\?)開始,但是這將在一個正則表達式中一次檢查一個位置,並且如果?位於一個單詞的開頭,這將不實用。因此,在查找?(?=.*\?)之前,還需要允許任意數量的字符(甚至是0)。現在

.*將使整個字正則表達式去,這是不理想的,用\S*更換:

\b(?=\S*\?)\S+ 

實際上,你可以刪除最後一個\b因爲一個字也不會走的更遠超過\S

regex101 demo

+0

沒有匹配組雖然 - 正則表達式匹配很好,並且會一致 - 括號需要調整(但不能看到哪裏)以便匹配 –

+0

@ GrahamRitchie如果'?'可以位於單詞的任何位置,則至少需要兩個捕獲組並修改正則表達式。在這種情況下,我認爲取代結果會更適合刪除'?'。 – Jerry

+0

有效點 - 我讀的問題(根據我的正則表達式)簡單地說是?在句子結尾處 - 你是對的 - 我通常是第一個告訴人們停止使用正則表達式作爲解決所有問題的方法 - 現在我正在這樣做 - 呃! –

1

正則表達式如下:

$string = "this is a? example sentence? to test the regex?"; 

$output_array = array(); 
preg_match_all("/\b([a-zA-Z]*)\?/", $string, $output_array); 

print_r($output_array[1]); 

這將在年底返回沒有?所有的比賽。