【问题标题】:Extract substring from string with Regex使用正则表达式从字符串中提取子字符串
【发布时间】:2010-10-14 02:37:09
【问题描述】:

假设用户在多台计算机中插入字符串。

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

这些配置(Regex 模式)因每台计算机而异,管理员应该可以更改,而无需更改源代码。

一些例子:

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

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

【问题讨论】:

  • 您能否给我们一些其他示例来说明您要匹配的内容?长度和格式是否不同,还是总是 4 个字符、2 个数字、4 个字符和 3 个数字?

标签: c# regex


【解决方案1】:

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

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);

【讨论】:

  • 我没有解释自己。对此感到抱歉。我希望将所有这些模式都放在一个适用于特定案例的表格中。
  • 我很确定您可以想到一个简单的语法来表达上述内容 - 例如 [4,2] 和 [-3,3] (其中 - 表示“从右侧”)
  • 无需重新编译即可配置。
  • 是的,问题在于配置的灵活性。我不确定这可以在 Regex 中完成,但会很有帮助!
【解决方案2】:

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

^...(..)

还有:

.*(...)$

【讨论】:

  • .* 在您的正则表达式 #2 中是不必要的。甚至需要查看最后三个字符之前的任何内容。
  • 没有必要,但可以减少回溯。现在它将第一个表达式 (.*) 扩展为整个字符串,然后仅回溯最后三个字符以匹配整个表达式。否则它会检查每个字符是否已经到达终点。
  • 您的回答是我想要达到的结果的一部分。谢谢。
【解决方案3】:

要让正则表达式捕获值以供进一步使用,您通常使用 (),这取决于正则表达式编译器,它可能是 () 或对于 microsoft MSVC,我认为它是 []

例子

User4 -  123456pp12asd         ppsd  

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

可能是这样的

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

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

【讨论】:

  • 这就是我要找的!在 C# 中,我认为您无法指定结果的返回方式,我只能应用此模式 ^......(..)...(..)$ ,在这种情况下,我将不得不处理每个 match.Group[x] 我自己。非常感谢!
  • 嘿,但是如果你知道在 C# 中处理所有匹配项的方法,请告诉我!
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    string section = str.Substring(pos, length)
    

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 2014-08-25
        • 2021-09-25
        • 1970-01-01
        • 2023-02-09
        相关资源
        最近更新 更多