【发布时间】:2010-10-12 18:22:11
【问题描述】:
输入字符串是这样的:OU=TEST:This001。我们需要额外的“This001”。最好的 C#。
【问题讨论】:
输入字符串是这样的:OU=TEST:This001。我们需要额外的“This001”。最好的 C#。
【问题讨论】:
怎么样:
/OU=.*?:(.*)/
这是它的工作原理:
OU= // Must contain OU=
. // Any character
* // Repeated but not mandatory
? // Ungreedy (lazy) (Don't try to match everything)
: // Match the colon
( // Start to capture a group
. // Any character
* // Repeated but not mandatory
) // End of the group
对于/,它们是分隔符,用于知道正则表达式的开始位置和结束位置(以及添加选项)。
捕获的组将包含This001。
但使用简单的Substring() 会更快。
yourString.Substring(yourString.IndexOf(":")+1);
资源:
【讨论】:
"OU=" 闻起来就像您正在执行 Active Directory 或 LDAP 搜索并响应结果。虽然 regex 是一个出色的工具,但我只是想确保您也了解出色的 System.DirectoryServices.Protocols 类,这些类仅用于解析、过滤和操作此类数据。
SearchResult、SearchResultEntry 和 DirectoryAttribute 尤其是您可能正在寻找的朋友。我不怀疑您可以像下一个人一样聪明地进行正则表达式或子字符串,但工具箱中还有另一个好工具也很好。
你试过这些课程吗?
【讨论】:
没有正则表达式的解决方案:
var str = "OU=TEST:This00:1";
var result = str.Split(new char[] { ':' }, 2)[1];
// result == This00:1
Regex vs Split vs IndexOf
拆分
var str = "OU=TEST:This00:1";
var sw = new Stopwatch();
sw.Start();
var result = str.Split(new char[] { ':' }, 2)[1];
sw.Stop();
// sw.ElapsedTicks == 15
正则表达式
var str = "OU=TEST:This00:1";
var sw = new Stopwatch();
sw.Start();
var result = (new Regex(":(.*)", RegexOptions.Compiled)).Match(str).Groups[1];
sw.Stop();
// sw.ElapsedTicks == 7000 (Compiled)
索引
var str = "OU=TEST:This00:1";
var sw = new Stopwatch();
sw.Start();
var result = str.Substring(str.IndexOf(":") + 1);
sw.Stop();
// sw.ElapsedTicks == 40
获胜者:分裂
链接
【讨论】:
:,它将得到它之后的所有内容。
str.Split(new char[] { ':' }, 2)第二个参数表示要拆分多少块。告诉分成 2 会导致 OU=jjj:kkkkkk:aaaaa:ssssss:xxxx 将返回 2 个组:OU=jjj 和 kkkkkk:aaaaa:ssssss:xxxx
如果OU=TEST: 是您要匹配的字符串之前的要求,请使用此正则表达式:
(?<=OU\s*=\s*TEST\s*:\s*).*
该正则表达式匹配冒号之后的任何长度的文本,而冒号之前的任何文本只是一个要求。
您可以将TEST 替换为[A-Za-z]+ 以匹配除TEST 之外的任何文本,或者您可以将TEST 替换为[\w]+ 以匹配任意长度的字母和数字组合。
\s* 表示该位置可能是任意数量的空格或什么都没有,如果您不需要这样的检查,请将其删除。
【讨论】: