2017-05-23 71 views
0

我想要獲取我的程序集的版本號。我使用正則表達式,這是我的模式。排除特殊字符與正則表達式

$pattern = '\[assembly: AssemblyVersion\("(.*)"\)\]' 

它的工作不錯,但在AssemblyInfo.cs中和AssemblyInfo.vb中存在的.vb文件在CS文件

// by using the '*' as shown below: 
// [assembly: AssemblyVersion("1.0.*")] 
[assembly: AssemblyVersion("3.7.1.0")] 

一些特殊的字符作爲例子

' <Assembly: AssemblyVersion("1.0.*")> 
    <Assembly: AssemblyVersion("3.2.0.0")> 
<Assembly: AssemblyFileVersion("1.0.0.0")> 

所以我想排除//和'charachters在我的模式。我試圖用[^ //]排除它,但它不起作用。我嘗試了其他的東西,但它也沒有奏效。

而第二個問題是

在.vb文件,也有不同的首發。

<Assembly: AssemblyVersion("3.2.0.0")> 

,並在C#中的文件有不同的出發

[assembly: AssemblyVersion("3.7.1.0")] 

我怎麼能還包括VB版到我的模式?

問題在哪裏?

+0

將模式固定在行首,只有可選的空白符:'^ \ s * \ [assembly:AssemblyVersion \(「(。*)」\)\]' –

+0

但是,我沒有看到'/'在你的版本字符串中 – anubhava

+0

你是否真的需要匹配你正在使用該模式的語言的整個行?你能不能和大會匹配:...?這是更多文本的一部分嗎?如果你只需要捕捉括號內的所有內容,這可以簡單得多。 – mickmackusa

回答

1

您可以使用排除lookbehind如果你的庫支持它

(?<!\/\/\s|\'\s)\[assembly: AssemblyVersion\("(.*)"\)\] 

編輯:
匹配不同的支架,你可以只使用[variant1|variant2]語法

(?<!\/\/\s|\'\s)[<\[][Aa]ssembly: AssemblyVersion\("(.*)"\)[>\]] 
+0

謝謝您的回覆。你能檢查我的問題嗎?我看到了vb和cs文件之間的一些區別。在cs文件中,它以[assembly,並在vb文件中開始 ertan2002

+0

您對*'[variant1 | variant2]'語法*的理解不正確。 '[a | b]'匹配三個字符之一:'a','''','b'。你一定是指'(a | b)'。 –

+0

你是完全正確的。然而,圓括號會創建一個捕獲組,所以我重寫了正則表達式來使用[]作爲列表,而不是 –

1

你想「排除」行其從/'開始。

從設置開始m多行)在你的正則表達式中的標誌。 它確保^匹配(不是整個字符串)的開頭。

然後開始從正則表達式:

  • ^ - 一個負先行組與兩個變體 - 作爲一個行開始標記
  • (?!\/|')現在作用(在多行模式)在內部(不要讓該行從/'開始),
  • \s* - 可選的空間序列秒。

然後去你的正則表達式。

所以整個正則表達式應如下:

^(?!\/|')\s*\[assembly: AssemblyVersion\("(.*)"\)\] 

(還記得關於m標誌)。在其他的答案中提到

負回顧後解決方案有這樣的缺陷 即使一行從'/將啓動,但有沒有空間此後, 這樣一個正則表達式將失敗。