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

时间:2009-05-07 21:38:43

标签: c# regex

我有一个可以执行“IntPow(3,2)”等功能的mathparser。如果用户粘贴“1,000,000”然后添加加号,则使完整的等式“1,000,000 + IntPow(3,2)”解析器失败,因为它不适用于包含逗号的数字。

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

当我说“删除逗号”时,我的意思是删除“CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator”,它可以是逗号或句点,具体取决于本地。这部分很简单,因为我假设将使用RegEx,我可以在RegEx逗号位置连接该值。

我有这个RegEx :(。*?)用于查找其中的括号和值但我不确定如何只删除RegEx匹配之外的逗号。

4 个答案:

答案 0 :(得分:6)

最简单的方法是不要尝试让正则表达式做到这一点。只需在字符串上循环一个字符。如果你读'(',递增一个计数器。如果你读''',则递减该计数器。如果你读了一个逗号,如果计数器为0则删除它,否则不管它。

答案 1 :(得分:2)

但是如果用户粘贴了怎么办:

1,000+IntPow(3,000,2,000)

现在3,000在逗号之间。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我不认为使用正则表达式是可行的。区分内部和外部括号不是常规语言。它是一种上下文非敏感语言,无法使用常规状态机(表达式)来决定。你需要一台堆栈机器(即链接由Chad决定的东西)