如何从C#中的字符串中删除所有不在括号内的逗号?

如何从C#中的字符串中删除所有不在括号内的逗号?,c#,regex,C#,Regex,我有一个mathparser,它可以执行“IntPow(3,2)”之类的函数。如果用户粘贴“1000000”,然后添加一个加号,使完整的等式“1000000+IntPow(3,2)”,解析器将失败,因为它不能处理包含逗号的数字 我需要删除“1000000”中的逗号,但不需要删除“IntPow(3,2)”中的逗号,因为IntPow有两个用逗号分隔的参数。最终方程式为“1000000+IntPow(3,2)”。方程式存储在一个字符串中。如何仅删除括号外的逗号?我假设并说包含逗号的数字不会被放入Int

我有一个mathparser,它可以执行“IntPow(3,2)”之类的函数。如果用户粘贴“1000000”,然后添加一个加号,使完整的等式“1000000+IntPow(3,2)”,解析器将失败,因为它不能处理包含逗号的数字

我需要删除“1000000”中的逗号,但不需要删除“IntPow(3,2)”中的逗号,因为IntPow有两个用逗号分隔的参数。最终方程式为“1000000+IntPow(3,2)”。方程式存储在一个字符串中。如何仅删除括号外的逗号?我假设并说包含逗号的数字不会被放入IntPow参数列表中

我说的“删除逗号”实际上是指删除“CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator”,它可以是逗号,也可以是句点,具体取决于本地语言。这一部分将很简单,因为我假设将使用正则表达式,并且我可以在正则表达式逗号处包含该值


我有一个正则表达式:(.*)用于查找括号和括号内的值,但我不确定如何只删除正则表达式匹配项之外的逗号。

但是如果用户粘贴:

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给出了答案,你提供了示例代码。太糟糕了,我不能两者都选。在这种情况下,我将不得不使用解释作为最佳答案,因为它解释了如何完成(代码也解释了,但单词更通用)。我还是会对这个答案投赞成票。