如何从C#中的字符串中删除所有不在括号内的逗号?
我有一个mathparser,它可以执行“IntPow(3,2)”之类的函数。如果用户粘贴“1000000”,然后添加一个加号,使完整的等式“1000000+IntPow(3,2)”,解析器将失败,因为它不能处理包含逗号的数字 我需要删除“1000000”中的逗号,但不需要删除“IntPow(3,2)”中的逗号,因为IntPow有两个用逗号分隔的参数。最终方程式为“1000000+IntPow(3,2)”。方程式存储在一个字符串中。如何仅删除括号外的逗号?我假设并说包含逗号的数字不会被放入IntPow参数列表中 我说的“删除逗号”实际上是指删除“CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator”,它可以是逗号,也可以是句点,具体取决于本地语言。这一部分将很简单,因为我假设将使用正则表达式,并且我可以在正则表达式逗号处包含该值如何从C#中的字符串中删除所有不在括号内的逗号?,c#,regex,C#,Regex,我有一个mathparser,它可以执行“IntPow(3,2)”之类的函数。如果用户粘贴“1000000”,然后添加一个加号,使完整的等式“1000000+IntPow(3,2)”,解析器将失败,因为它不能处理包含逗号的数字 我需要删除“1000000”中的逗号,但不需要删除“IntPow(3,2)”中的逗号,因为IntPow有两个用逗号分隔的参数。最终方程式为“1000000+IntPow(3,2)”。方程式存储在一个字符串中。如何仅删除括号外的逗号?我假设并说包含逗号的数字不会被放入Int
我有一个正则表达式:(.*)用于查找括号和括号内的值,但我不确定如何只删除正则表达式匹配项之外的逗号。但是如果用户粘贴:
1,000+IntPow(3,000,2,000)
现在3000介于逗号之间。最简单的方法是不要让正则表达式这样做。只需在字符串上一次循环一个字符。如果读取“(”,则递增一个计数器。如果读取“”,则递减该计数器。如果读取逗号,请在计数器为0时将其删除,否则将其保留。
Sub Main()
Sub Main()
'
' remove Commas from a string containing expression-like syntax
' (eg. 1,000,000 + IntPow(3,2) - 47 * Greep(9,3,2) $ 5,000.32 )
' should become: 1000000 + IntPow(3,2) - 47 * Greep(9,3,2) $ 5000.32
'
Dim tInput As String = "1,000,000 + IntPow(3,2) - 47 * Greep(9,3,2) $ 5,000.32"
Dim tChar As Char = Nothing
Dim tResult As StringBuilder = New StringBuilder(tInput.Length)
Dim tLevel As Integer = 0
For Each tChar In tInput
Select Case tChar
Case "("
tLevel += 1
tResult.Append(tChar)
Case ")"
tLevel -= 1
tResult.Append(tChar)
Case "," ' Change this to your separator character.
If 0 < tLevel Then
tResult.Append(tChar)
End If
Case Else
tResult.Append(tChar)
End Select
Next
Console.ForegroundColor = ConsoleColor.Cyan
Console.WriteLine(tInput)
Console.WriteLine(String.Empty)
Console.ForegroundColor = ConsoleColor.Yellow
Console.WriteLine(tResult.ToString)
Console.WriteLine()
Console.ResetColor()
Console.WriteLine(" -- PRESS ANY KEY -- ")
Console.ReadKey(True)
End Sub
'
'从包含类似表达式语法的字符串中删除逗号
(例如1000000+IntPow(3,2)-47*Greep(9,3,2)$5000.32)
'应该变成:1000000+IntPow(3,2)-47*Greep(9,3,2)$5000.32
'
Dim tInput As String=“1000000+IntPow(3,2)-47*Greep(9,3,2)$5000.32”
Dim tChar As Char=无
作为StringBuilder的Dim tResult=新StringBuilder(tInput.Length)
Dim T级别为整数=0
对于tInput中的每个tChar
选择案例tChar
案例“(”
t水平+=1
tResult.Append(tChar)
案例“)”
t水平-=1
tResult.Append(tChar)
大小写“,”将其更改为分隔符字符。
如果0
我认为使用正则表达式不可能做到这一点。区分内括号和外括号不是一种常规语言。它是一种上下文不敏感的语言,不能使用常规状态机(表达式)来确定。您需要一个堆栈机器(即Chad决定的链接)您是否假设所有括号都是平衡的,即每个“(“有一个匹配的”)?这可能不起作用,因为IntPow()函数不接受四个参数。解析器在到达IntPow函数之前会先处理1000。括号内的数字也可以是逗号-数字分组格式。问题中提到了这一点:“我假设并说包含逗号的数字不会被放入IntPow参数列表中。”。我的意思是如果是这样的话,它就不会计算了,我同意。Chad Birch给出了答案,你提供了示例代码。太糟糕了,我不能两者都选。在这种情况下,我将不得不使用解释作为最佳答案,因为它解释了如何完成(代码也解释了,但单词更通用)。我还是会对这个答案投赞成票。