Как бы я удалить все запятые не в скобках из строки в C #? - PullRequest
0 голосов
/ 08 мая 2009

У меня есть математический анализатор, который может выполнять такие функции, как «IntPow (3,2)». Если пользователь вставляет «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 ]

6 голосов
/ 08 мая 2009

Самый простой способ - не пытаться заставить это сделать регулярное выражение. Просто зациклите строку по одному символу за раз. Если вы читаете '(', увеличиваете счетчик. Если вы читаете ')', уменьшаете этот счетчик. Если вы читаете запятую, удалите ее, если счетчик равен 0, в противном случае оставьте ее в покое.

2 голосов
/ 08 мая 2009

Но что, если пользователь вставит:

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

Теперь 3000 между запятыми.

1 голос
/ 08 мая 2009

Я не думаю, что это возможно с помощью регулярных выражений. Различение между внутренними и внешними скобками не является обычным языком. Это контекстно-нечувствительный язык, который нельзя определить с помощью обычного конечного автомата (выражения). Вам нужен стековый компьютер (то есть что-то, связанное с решением Чада)

1 голос
/ 08 мая 2009
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...