2014-09-26 90 views
1

我有一個字符串解析。首先,我要檢查,如果一串包含特殊模式:正則表達式尋找特殊模式

  1. 我想知道是否有與「$啓動子(」 和結束「)」,
  2. 和那些之間的開始和結束特殊的字符串,不應該有 任何空白空間,
  3. 它不應該在其中包含「$」字符。

我有一個小的正則表達式在C#

string input = "$(abc)"; 
string pattern = @"\$\(([^$][^\s]*)\)"; 
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase); 

MatchCollection matches = rgx.Matches(input); 
foreach (var match in matches) 
{ 
    Console.WriteLine("value = " + match); 
} 

它工作在很多情況下,但在輸入= $(A $(),其表達的內部是空的失敗。我想不來什麼是錯的我正則表達式匹配時輸入$()有開始和結束標識符之間沒什麼]

+1

你剛剛使用了'string input =「$()」;'還是你之後放了別的東西? – Jerry 2014-09-26 07:22:15

+0

對不起,失敗的輸入= $($($)$(AND)thereis $是違反我的規則 – 2014-09-26 07:36:46

+0

那麼,你應該合併否定類'[^ $]'和'[^ \ s]' ,我指出了正則表達式的另一個可能的問題,因爲我不知道你的輸入在我的答案中的性質。 – Jerry 2014-09-26 07:38:18

回答

2

您當前的正則表達式不比賽$()因爲[^$]比賽至少1個字符。當你有一個包含不止一個括號,如輸入我能想到的,你將有這場比賽的唯一方法是:

$()(something) 

在這種情況下,你還需要至少排除閉幕括號:

string pattern = @"\$\(([^$\s)]+)\)"; 

例如上述匹配:

  • abc$(abc)
  • abcdef in $(def)$()$(abc)(something)
3

注意:?[^$]匹配單個字符,但不是$

使用,如果你想下面的正則表達式匹配$()

\$\(([^\s$]*)\) 

使用正則表達式如下,如果你不想匹配$()

\$\(([^\s$]+)\) 
  • *重複前面的令牌零或更多次。
  • +重複上述令牌一次或多次。

你的正則表達式\(([^$][^\s]*)\)是錯誤的。它不會允許$作爲()中的第一個字符,但它允許它作爲第二或第三,等等。請參閱演示here。您需要將正則表達式中的否定類結合起來,以匹配任何非空格或$的字符。

1

只需將*替換爲+併合並選項即可。

string pattern = @"\$\(([^$\s]+)\)"; 

+ 1手段或更多

*表示0以上