【问题标题】:How to grab specific elements out of a string如何从字符串中获取特定元素
【发布时间】:2013-02-26 21:29:22
【问题描述】:

我需要能够从以大括号开始和结束的字符串中获取特定元素。如果我有一个字符串:

“asjfaieprnv{1}oiuwehern{0}oaiwefn”

我怎么能只抓住 1,然后是 0。

【问题讨论】:

  • String 有一些方法可以帮助你做到这一点。如果这还不够,请查看 Regex。
  • @BrianRasmussen 字符串不规则,RegEx 不起作用,常规解析也不起作用。
  • @evanmcdonnal 对不起,我不关注。也许我不明白他想做什么。我的理解是他想抓住卷发中的数字。 RegEx 肯定可以做到这一点。
  • @BrianRasmussen 带有平衡括号(或其他包含数据的大括号)的语言不是正则的,不能用正则表达式解析(至少在一般情况下不是)。 RegEx 可以解析那个确切的字符串,但不是一个通用的解决方案。

标签: c# string parsing


【解决方案1】:

正则表达式对此非常有用。

你要匹配的是:

\{   # a curly bracket
     # - we need to escape this with \ as it is a special character in regex
[^}] # then anything that is not a curly bracket
     # - this is a 'negated character class'
+    #  (at least one time)
\}   # then a closing curly bracket
     # - this also needs to be escaped as it is special

我们可以把它折叠成一行:

\{[^}]+\}

接下来,您可以通过将要提取的部分用括号括起来形成一个来捕获和提取内部内容:

\{([^}]+)\}

在 C# 中你会这样做:

var matches = Regex.Matches(input, @"\{([^}]+)\}");
foreach (Match match in matches)
{
    var groupContents = match.Groups[1].Value;
}

第 0 组是整个匹配项(在这种情况下包括 {}),第 1 组是第一个括号部分,依此类推。

一个完整的例子:

var input = "asjfaieprnv{1}oiuwehern{0}oaiwef";
var matches = Regex.Matches(input, @"\{([^}]+)\}");
foreach (Match match in matches)
{
    var groupContents = match.Groups[1].Value;
    Console.WriteLine(groupContents);
}

输出:

1
0

【讨论】:

  • 那个字符串不规则,正则表达式对此完全没用。
  • @evanmcdonnal:问题告诉我,他们只想提取{...} 的简单内容,这是常规的。没有匹配的嵌套括号。 (即使有,.NET 正则表达式引擎也能够匹配嵌套括号,它不限于纯正则表达式。)
  • 你假设他永远不会在一个字符串中有{{0}},这是相当多的假设。如果你可以假设永远不会有嵌套的大括号,那么解决方案是微不足道的,RegEx 仍然是一个糟糕的解决方案。
【解决方案2】:

使用 Indexof 方法:

int openBracePos = yourstring.Indexof ("{");
int closeBracePos = yourstring.Indexof ("}");
string stringIWant = yourstring.Substring(openBracePos, yourstring.Len() - closeBracePos + 1);

这将是您的第一次出现。您需要对字符串进行切片,以便第一次出现不再存在,然后重复上述过程以找到第二次出现:

yourstring = yourstring.Substring(closeBracePos + 1);

注意:您可能需要转义花括号:“{” - 不确定;从未在 C# 中处理过它们

【讨论】:

  • 谢谢先生,这很好用,但是我确实必须更改一件事才能获得大括号的内容,我必须将第三行更改为: string stringIWant = yourstring.Substring(openBracePos, closeBracePos + 1 - openBracePos);
【解决方案3】:

这看起来像是正则表达式的工作

using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "asjfaieprnv{1}oiuwe{}hern{0}oaiwefn";
            Regex regex = new Regex(@"\{(.*?)\}");

            foreach( Match match in regex.Matches(str))
            {
                 Console.WriteLine(match.Groups[1].Value);
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2019-10-26
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多