我有这个用于定义标识符的正则表达式:
[\w|@|#|_][\w|\.|\$|@|#|_]*
我需要允许使用[group]或“group”分组的标识符组,并且允许“s”在“group”内部,你需要写“”(两个),并且[group]相同你会做的]]一个人。]
该组可能包含标识符,空格和任何这些字符中允许的任何内容: 代字号(〜) 连字符( - ) 感叹号(!) 左支撑({) 百分 (%) 右括号(}) 插入符号(^) 撇号(') &符号(&) 期间(。) 左括号(() 反斜杠() 右括号()) 口音坟墓(`)
示例:
"asda$@.asd ' a12876 ]] "" " => asda$@.asd ' a12876 ]] "
[asda$@.asd ' a12876 ]] "" ] => asda$@.asd ' a12876 ] ""
答案 0 :(得分:1)
您|
中不需要任何[character classes]
,因为它会导致任何字符匹配。 (我假设您不希望标识符以|
开头,例如。
string mystring = "[asda$@.asd ' a12876 ]] \"\" ]";
Console.WriteLine(mystring);
MatchCollection matches =
Regex.Matches(mystring,
@"[\w@#](?:[\w\.\$@#])*|\[[\w@#](?:\[\[|\]\]|[""\w\s\.\$@#'])*\]|""[\w@#](?:\""\""|['\s\[\w\.\$@#\]])*""",
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
foreach (Match match in matches)
{
string id = match.Value;
// The first character of the match tells us which escape sequence to use
// for the replacement.
if (match.Value[0] == '[')
id = id.Substring (1, id.Length - 2).Replace ("[[", "[").Replace ("]]", "]");
else if (match.Value[0] == '"')
id = id.Substring (1, id.Length - 2).Replace ("\"\"", "\"");
Console.WriteLine (id);
}