【问题标题】:Extracting text between last pair of parentheses from a string without RegEx从没有RegEx的字符串中提取最后一对括号之间的文本
【发布时间】:2013-10-17 12:58:49
【问题描述】:

我有一个字符串列表,其中一个项目类似于textItem1 = "Brown, Adam. (user)(admin)(Sales)",我总是必须从最后一对括号中提取文本,在本例中为Sales

我尝试了以下方法:

string name = DDlistName.SelectedItem.ToString();
int start = name.IndexOf("(");
int end = name.IndexOf("(");
string result = name.Substring(start + 1, end - start - 1);
_UILabelPrintName.Text = result;

问题:这总是从第一对括号中挑选文本,在本例中为 user

阅读大量类似问题的答案后,我意识到在这种情况下可能不推荐使用正则表达式(尝试其他代码也没有特别成功)。然而,任何可以完成任务的简短例程的帮助将不胜感激。

【问题讨论】:

  • 因为 textItem 也可以有嵌套括号。如“Brown, Adam.(user)((ADM)admin(offshore))(Sales)”。 (stackoverflow.com/a/546457/1108500)
  • 啊啊,这让答案变得更复杂了 =)
  • 在这些情况下,编写一个解析器使用您的输入字符串应该没有问题,例如stackoverflow.com/a/524624/524475
  • 但由于最后一个词总是在一对括号内,@jltrem 的解决方案似乎奏效了。但是我不知道这是否是完成这项任务的有效方法。

标签: c# asp.net parentheses text-extraction


【解决方案1】:

您需要使用LastIndexOf 而不是IndexOf,并检查末尾是否有右括号。

string name = "Brown, Adam. (user)(admin)(Sales)";
int start = name.LastIndexOf("(");
int end = name.LastIndexOf(")");
string result = name.Substring(start + 1, end - start - 1);

您确实需要验证 startend 以确保找到两个括号。如果找不到字符,LastIndexOf 返回-1

为了处理嵌套,我们需要在左括号的位置之后向前搜索右括号。

 string name = "Brown, Adam. (user)(admin)((Sales))";
 int start = name.LastIndexOf('(');
 int end = (start >= 0) ? name.IndexOf(')', start) : -1;
 string result = (end >= 0) ? name.Substring(start + 1, end - start - 1) : "";

【讨论】:

    【解决方案2】:

    您可以使用 split 函数,在左括号处断开字符串。最后一个数组元素是带有尾部“)”的所需输出,然后将被删除。

    var input = "Brown, Adam. (user)(admin)(Sales)";
    // var input = DDlistName.SelectedItem.ToString();
    
    var lastPick = input.Split(new[] { "(" }, StringSplitOptions.RemoveEmptyEntries).Last(); 
    var output = lastPick.Substring(0, lastPick.Length - 1);
    
    _UILabelPrintName.Text = output;
    

    另一种方法是使用带有IndexOf 的while 循环。只要找到另一个“(”,它就会剪切输入字符串。如果没有找到更多的“(”,它将获取剩余字符串的内容,直到右括号“)”:

    int current = -1;
    while(name.IndexOf("(") > 0)
    {
        name = name.Substring(name.IndexOf("(") + 1);
    }
    
    var end = name.IndexOf(")");
    var output = name.Substring(0, end);
    
    _UILabelPrintName.Text = output;
    

    或者使用LastIndexOf....

    【讨论】:

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