2013-06-25 51 views
1

如果我想匹配如下:正則表達式,除非裏面的「講話標誌」

slashdot    <-Hit 

" slashdot "  <-Hit 

" slashdot   <-Hit 

    slashdot "  <-Hit 

"slashdot"    <-Miss 

(Incuding如果是不帶換行符),我怎麼會是正則表達式?

我會喜歡它,以便語言符號取消匹配,但只有在內容和語音標記之間絕對沒有空格時。

我發現有關如何檢測speechmarks

(?=(?:(?:[^"]*+"){2})*+[^"]*+\z) 

但我無法一一說明,這樣,如果有任何空格,命中依然取得了計算器上一些樣品。

非常感謝所有幫助。 (我是新來的StackOverflow,非常像了!我想,我可以回答許多問題要問別人,學習中,我聽見)


簡而言之

slashdot - good 
"slashdot" - bad 
" slashdot " - good (as there are spaces) 
+0

嗨 - 你之間' 「'和'」',那裏是一個空間之前和後引號後一切? – Noqomo

+1

,我想一切都匹配「Slashdot的」,除非是內部speechmarks沒有空格 – mrmrw

+0

所以 Slashdot的 - 好 「Slashdot的」 - 壞 「Slashdot的」 - 好(因爲有空格) – mrmrw

回答

3

說明

這個正則表達式只會找到沒有引號的行,或者引號和引用之間有空白的地方。這個表達式假設第一個非空格字符如果存在就是引號。如果第一個非空格字符不是開引號,則允許整行。

^\s*(?:[^"].*|"\s.*\s"?)\s*(?:$|\r|\n|\Z)

enter image description here

PHP代碼示例:

輸入字符串

slashdot   
" slashdot " 
" multiline 1 slashdot  
    line 2 slashdot " 
"slashdot bad"   
    " leading spaces and trailing spaces " 

代碼

<?php 
$sourcestring="your source string"; 
preg_match_all('/^(?:[^"].*|"\s[^"]*\s")/imx',$sourcestring,$matches); 
echo "<pre>".print_r($matches,true); 
?> 

匹配

$matches Array: 
(
    [0] => Array 
     (
     [0] => slashdot   
     [1] => " slashdot " 
     [2] => " multiline 1 slashdot  
     [3] =>  line 2 slashdot " 
     [4] =>  " leading spaces and trailing spaces " 
     ) 

) 
+0

哇!感謝您的幫助。非常讚賞。我希望我可以很快爲其他人回答很多問題,因爲對於計算器而言是新的東西,但什麼是社區! :) – mrmrw

+0

令人敬畏的圖表+1。你有一個工具生產嗎? – Racheet

+1

@Racheet,我正在使用debuggex.com。儘管它不支持lookbehinds,命名捕獲組或原子組,但它仍然可以方便地理解表達式流。還有regexper.com。他們也做得很好,但在打字時並不是實時的。 –