2012-10-08 71 views
1

使用C#在.NET 4.0中開發。 (很抱歉,如果這是囉嗦......)如何使用Regex在命令行字符串中搜索文件名?

我想創建一個方法,如:

public static string GetCmdLineArgs(
    string cmdLine, 
    string pathname) 
{ 
    ... 
} 

我想創建一個正則表達式模式,可以讓讓我後提取的參數可執行文件的路徑名。規則:

  1. 命令行可能會或可能不會引用路徑名。
  2. 如果路徑名存在,它將被引用。
  3. 路徑名將是絕對路徑。因此,它將包含正則表達式特殊字符,如「\」,「。」,以及其他可能的字符。
  4. 如果引用的路徑名沒有出現在命令行的開頭,只需捕獲並返回命令行,而不是任何前導空格。
  5. 路徑名也可能出現在參數中。如果是這樣,這些事件應該被保留下來,並與其餘的論點一起返回。
  6. 應該放棄引導路徑名稱周圍的空白字符。
  7. 現在,只需返回單個字符串中的所有參數即可,但將來可能會添加特定參數的捕獲組。

我意識到,我可以通過簡單的操作System.String一起破解這個功能,但我也想知道如何使用正則表達式匹配,以保持未來變化的靈活性,做到這一點。

基本上,我想要做的事,如:

// Create the pattern: 
// The pathname is anchored to the beginning of the pattern. 
// The pathname group is non-capturing. 
// Additional capture groups may be added in the future. 
string pattern = 
    @"^\s*(?:""" + pathname + """)?\s*(.*)"; 
Regex regex = new Regex(pattern); 
Match = regex.Match(cmdLine); 
if (match.Success) 
{ 
    // extract matching groups... 
} 

顯然,上述將無法正常工作,是因爲正則表達式特殊字符pathname存在。有沒有一些方法可以修改它,以便像我所描述的那樣工作?是否有一個分組操作符可以讓我匹配未轉義的字符串,還是我必須通過轉義所有可能的特殊字符來轉換pathname

如果此問題已在其他地方提出並回答,請將我指向該帖子。謝謝!

回答

3

請參閱Regex.Escape。我認爲這是你唯一缺少的東西。像

string pattern = 
    @"^\s*(?:""" + Regex.Escape(pathname) + """)?\s*(.*)"; 
+0

賓果感謝您的快速答覆雅lern sumthin'野應埃夫裏的一天... –

0

不要使用硬值而使用錨點類型標記。在這個例子中,我知道 - 將命令行選項從具有「。」的路徑中分割出來。這樣我就可以將輸出標記化,並可以提取參數的順序和包含的路徑。 )在正則表達式從路徑項過濾掉的命令行參數

string commandLine = @"-abc -log ""C:\Test it"" -def"; 

// \x22 is the escape for " 
string pattern = @" 
(?(\x22)        # If a " then capture 
    ((?:\x22)(?<Path>[^\x22]+)(?:\x22)) 
|          # Or 
    ((?:-)(?<Command>[^-\s]+)(?:\s?))  # It is a - and capture 
) 
"; 

var tokens = Regex.Matches(commandLine, pattern, RegexOptions.IgnorePatternWhitespace) 
        .OfType<Match>() 
        .Select (m => new 
        { 
        Arg = m.Groups["Command"].Value, 
        Path = m.Groups["Path"].Value 
        }) 
        ; 

令牌的輸出是:!

enter image description here

相關問題