是否可以编写正则表达式来检查一些条件

时间:2016-04-13 23:47:46

标签: c# regex

我可以使用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

但这很难看。是否有漂亮/干净/简单的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

[.*]不会做你想做的事; []是包含字符类的正则表达式元字符;如果您要搜索这些字符,则必须在\之前搜索这些字符。 \[.*\]会要求您的字符串以[开头,因此您的第一个示例将不匹配。 .*匹配任何字符,包括],因此您无法确定字符串是否以]结尾。

正如@jdweng建议的那样,您应该使用命名组来捕获模式中的单独子串。命名组的.NET语法为(?<name>pattern)。你的模式似乎有五个子串:

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

如果此模式匹配,expressionMatch.Groups["leftBracket"].Value将包含任何左括号或空字符串。例如,您可以确定文本是否用括号括起来:

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

剩下的条件留给读者练习。

答案 1 :(得分:0)

这应该适合你:

regex =([)?(\ w + \ s)?(\ @)?(text)]?

这将捕捉你想要的一切......

[ 可选的 @ 文本

祝你好运!

相关问题