2016-04-13 66 views
0

我能有一個string以下變種:是否可以寫一個正則表達式來檢查幾個條件

  • text
  • [text][@text]
  • [OPTIONAL text][OPTIONAL @text]

這些都是可能性。是否有可能通過正則表達式來方便地提取了以下信息:

  • 什麼是text
  • 是它通過[]包圍,
  • 是否有OPTIONAL字,
  • 是否有@之前text

至於什麼我迄今所做的,我可以

var expressionMatch = Regex.Match(token, "[.*]"); 
if (expressionMatch.Success) 
{ 
     // use now expressionMatch.Value; 
     // check in the same way whether OPTIONAL word is there, etc. 
} 

// the input == text, all properties are false 

但是,這是醜陋的。有沒有一個漂亮/乾淨/簡單的方法來做到這一點?

+1

我會命名這些組。不匹配的組將爲空:string pattern = @「(?'preBracket'\ [)?(?'optional'OPTIONAL)?\ s?(?'ampersand'@)?(?'text'\ W +)( 'postBracket' \])「?; – jdweng

回答

1

[.*]不會做你想要的; []是包含字符類的正則表達式元字符;如果你想搜索這些字符,你必須在它們之前用\\[.*\]將要求您的字符串以[開頭,因此您的第一個示例不匹配。 .*與任何字符匹配,包括],因此您無法確定您的字符串是否以]結尾。

正如@jdweng建議的那樣,您應該使用命名組來捕獲模式中的單獨子字符串。命名組的.NET語法是(?<name>pattern)。你似乎有你的格局5子:

(?<leftBracket>\[?)(?<optional>(OPTIONAL)?)(?<at>\@?)(?<text>[^\]]+)(?<rightBracket>\]?) 

如果這種模式匹配,expressionMatch.Groups["leftBracket"].Value將包含任何左括號或一個空字符串。例如,您可以確定文本是否被方括號括起來:

!string.IsNullOrEmpty(expressionMatch.Groups["leftBracket"].Value) 
    && !string.IsNullOrEmpty(expressionMatch.Groups["rightBracket"].Value) 

其餘條件僅供讀者參考。

0

這應該爲你做它:

正則表達式=()(\ w + \ S)(\ @)(文字)???]

這將捕獲你想要的一切....

[ 可選 @ 文本

祝你好運!

相關問題