如何仅在整个文本被括号包围时删除括号
本文关键字:包围 删除 文本 何仅 | 更新日期: 2023-09-27 18:09:53
我想只在整个文本被括号包围时删除括号。例如:
(text (text) text)
需要转换为:
text (text) text
我有一个非常简单的检查:
value = (value [0] == '(' && value [value .Length - 1] == ')') ? value.Substring(1, value .Length - 2) : value;
,但它失败了,错误地删除了这类字符串的括号:
(text (text) ) text (text)
谁能告诉我一种处理所有情况的方法?使用正则表达式也是OK
。注意,括号是平衡的。例如,这样的情况是不可能的:
( text ( text )
使用一个简单的循环进行测试,如果它是"有效的",删除第一个&最后:
bool isValid = value[0] == '(' && value[value.Length - 1] == ')';
int i = 1;
int c = 0;
for(; isValid && c >= 0 && i < value.Length - 1; i++)
{
if(value[i] == '(')
c++;
else if(value[i] == ')')
c--;
}
if(isValid && i == (value.Length - 1) && c == 0)
value = value.Substring(1, value.Length - 2);
这个扩展方法应该可以工作;
public static class StringExtensions
{
public static string RemoveParentheses(this string value)
{
if (value == null || value[0] != '(' || value[value.Length - 1 ] != ')') return value;
var cantrim = false;
var openparenthesesIndex = new Stack<int>();
var count = 0;
foreach (char c in value)
{
if (c == '(')
{
openparenthesesIndex.Push(count);
}
if (c == ')')
{
cantrim = (count == value.Length - 1 && openparenthesesIndex.Count == 1 && openparenthesesIndex.Peek() == 0);
openparenthesesIndex.Pop();
}
count++;
}
if (cantrim)
{
return value.Trim(new[] { '(', ')' });
}
return value;
}
}
像这样使用
Console.WriteLine("(text (text) ) text (text)".RemoveParentheses());
运行了几个测试用例,我认为这是好的
public string CleanString(string CleanMe)
{
if (string.IsNullOrEmpty(CleanMe)) return CleanMe;
string input = CleanMe.Trim();
if (input.Length <= 2) return input;
if (input[0] != '(') return input;
if (input[input.Length-1] != ')') return input;
int netParen = 1; // starting loop at 1 have one paren already
StringBuilder sb = new StringBuilder();
for (int i = 1; i < input.Length-1; i++)
{
char c = input[i];
sb.Append(c);
if (c == '(') netParen++;
else if (c == ')') netParen--;
if (netParen == 0) return input; // this is the key did the () get closed out
}
return sb.ToString();
}
我在Amit回答之前就开始了这个问题,但我认为这是相同的基本逻辑