我有一个可以执行“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匹配之外的逗号。
答案 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决定的东西)