我可以使用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
但这很难看。是否有漂亮/干净/简单的方法来做到这一点?
答案 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)]?
这将捕捉你想要的一切......
[ 可选的 @ 文本
祝你好运!