从没有RegEx的字符串中提取最后一对括号之间的文本

时间:2013-10-17 12:58:49

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

我有一个字符串列表,其中一个项目是textItem1 = "Brown, Adam. (user)(admin)(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;

问题:这总是从第一对括号中选取文字,在本例中为用户

阅读了很多类似问题的答案我意识到在这种情况下可能不会推荐使用正则表达式(不是特别成功地尝试其他代码)。但是,任何可以执行任务的短程序的任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:1)

您可以使用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 ....

答案 1 :(得分: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) : "";