正则表达式找到特殊模式

时间:2014-09-26 07:18:27

标签: c# regex

我有一个要解析的字符串。首先,我必须检查字符串是否包含特殊模式:

  1. 我想知道是否有以“$(”开头的子串 并以“)”结束,
  2. 并且在那些开始和结束特殊字符串之间,不应该存在 任何白空的空间,
  3. 它里面不应包含“$”字符。
  4. 我在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);
     }
    

    它适用于很多情况但输入失败= $($ $(),表达式内部为空。我想在输入为$()时不匹配。[开始和结束标识符之间没有任何内容]。

    我的正则表达式出了什么问题?

3 个答案:

答案 0 :(得分:3)

注意:[^$]匹配单个字符但不匹配$

如果您想匹配$()

,请使用以下正则表达式
\$\(([^\s$]*)\)

如果您不想匹配$()

,请使用以下正则表达式
\$\(([^\s$]+)\)
  • *重复前面的令牌零次或多次。
  • +重复前一个令牌一次或多次。

您的正则表达式\(([^$][^\s]*)\)是错误的。它不允许$作为()内的第一个字符,但它允许它作为第二个或第三个,等等。请参阅演示here。您需要在正则表达式中组合否定的类,以匹配任何不是空格或$的字符。

答案 1 :(得分:2)

您当前的正则表达式匹配$(),因为[^$]至少匹配1个字符。我能想到你将匹配这个匹配的唯一方法是当你有一个包含多个parens的输入时,例如:

$()(something)

在这些情况下,您还需要至少排除结束语:

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

以上匹配例如:

    abc和中
  • $(abc) {li> abcdef中的$(def)$()$(abc)(something)

答案 2 :(得分:1)

只需用+替换*并合并选项。

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

+表示1个或更多

*表示0或更多