使用Regex从字符串中提取子字符串

时间:2009-03-18 15:17:00

标签: c# regex

想象一下,用户正在多台计算机中插入字符串。

在一台计算机上,配置中的模式将提取该字符串的一些字符,比如说位置4到5。 在另一台计算机上,提取模式将返回其他字符,例如,字符串的最后3个位置。

这些配置(正则表达式模式)对于每台计算机都是不同的,管理员可以更改这些配置,而无需更改源代码。

一些例子:

         Original_String       Return_Value
User1 -  abcd78defg123         78
User2 -  abcd78defg123         78g1
User3 -  mm127788abcd          12
User4 -  123456pp12asd         ppsd

可以用正则表达式完成吗? 感谢。

6 个答案:

答案 0 :(得分:7)

为什么要使用正则表达式?有什么问题:

string foo = s.Substring(4,2);
string bar = s.Substring(s.Length-3,3);

(你可以把它们包起来做足够的边界检查 - 足够容易)

如果你真的想要,你可以把它包裹在Func<string,string>放在某个地方 - 但不确定我是否会烦恼,但是:

Func<string, string> get4and5 = s => s.Substring(4, 2);
Func<string,string> getLast3 = s => s.Substring(s.Length - 3, 3);
string value = "abcd78defg123";
string foo = getLast3(value);
string bar = get4and5(value);

答案 1 :(得分:3)

如果你真的想使用正则表达式:

^...(..)

.*(...)$

答案 2 :(得分:1)

我不确定您希望通过使用RegEx获得什么。 RegEx用于模式匹配。如果你想根据位置提取,只需使用子串。

答案 3 :(得分:1)

在我看来,Regex真的不是这里的解决方案。要返回从位置 pos (从0开始)和长度 length 开始的字符串部分,只需调用Substring函数:

string section = str.Substring(pos, length)

答案 4 :(得分:1)

分组。您可以在/^.{3}(.{2})/上匹配,然后查看组$ 1。

问题是为什么?正常的字符串处理,即实际的子字符串方法在意图上会更快更清晰。

答案 5 :(得分:1)

要获得正则表达式捕获值以供进一步使用,您通常使用(),具体取决于它可能是()或Microsoft MSVC,我认为它是[]

示例

User4 -  123456pp12asd         ppsd  

最有趣的是你有2个单独的捕获区域。是否有关于如何将它们连接在一起的默认规则,或者您是否希望能够指定如何生成结果?

也许像

r/......(..)...(..)/\1\2/  for ppsd
r/......(..)...(..)/\2-\1/ for sd-pp

你想运行一个正则表达式来获取捕获并自己处理它们,还是想运行更高级的操作命令?