2012-01-12 42 views
0

我寫了一個正則表達式來匹配php的常量定義。正則表達式匹配php的常量定義

實施例:

define('Symfony∞DI', SYS_DIRECTORY_PUBLIC . SYS_DIRECTORY_INCLUDES . SYS_DIRECTORY_CLASSES . SYS_DIRECTORY_EXTERNAL . 'symfony/di/'); 

這裏是正則表達式:

define\((\"|\')+([\w-\.-∞]+)+(\"|\')+(,)+((\s)+(\"|\')+([\w-(\')-\\"-\.-∞-\s-(\\)-\/]+)+(\"|\')|(([\w-\s-\.-∞-(\\)-\/]+)))\); 

當我使用ActionScript執行它工作正常。但是,當我用C#執行它給了我下面的錯誤:

parsing "define\((\"|\')+([\w-\.-∞]+)+(\"|\')+(,)+((\s)+(\"|\')+([\w-(\')-\\"-\.-∞-\s-(\\)-\/]+)+(\"|\')|(([\w-\s-\.-∞-(\\)-\/]+)))\);" - Cannot include class \s in character range. 

你能幫我解決這個問題?

回答

2

你似乎是使用正則表達式在一個完全令人費解的方式:

  1. 字符類中:-是特殊的,它有計算的間隔;我想你有一個排序反轉,.NET不處理,而PHP處理它(或者可能在PHP中整理順序不同)。你的角色類應該是[\w.∞]而不是[\w-.-∞],只是引用第一個例子;

  2. 無需圍繞\s\s+而不是(\s)+;同樣,,而不是(,)

  3. '不是regex的特殊的,如果你想匹配兩個字符,請使用字符類,而不是一組+替代:中['\"]代替(\'|\") - 並注意「「」被轉義,只是因爲你是在一個雙引號的字符串;

  4. 你的正則表達式是在開始時沒有固定,它看起來像你想在輸出的開始匹配define^define而不是define

的。 1。可能是你的問題的根源。

與上述所有重寫您正則表達式給出了這樣的(在雙引號):

"^define\(([\"'][\w.∞]+[\"'],(\s+[\"']+[\w'\".∞\s\\/]+)+[\"']|([\w\s.∞\\/]+))\);" 

這絕對不看,它永遠不會匹配您的輸入...

試試這個:

"^define\(\s*(['\"])[\w.∞]+\1\s*,\s*([\w/]+(\s*\.\s*[\w/]+)*\s*\);$" 
1

請參閱fge對您遇到的錯誤的回答。如果不從原始知道你特林做什麼,而不是偏離太多,這裏是一個另類的正則表達式:

define\(\s*(["'])\s*[\w.∞]+\s*\1(?:\s*[.,]\s*(["']?)\s*[\w/]+\s*\2)*\s*\);

define 
\(
    \s* (["']) 
    \s* [\w.∞]+ 
    \s* \1 
    (?: 
    \s* [.,] 
    \s* (["']?) 
    \s* [\w/]+ 
    \s* \2 
)* 
    \s* 
\);