Какой лучший способ удалить пробел после определенного символа в строке? - PullRequest
0 голосов
/ 17 апреля 2009

Я пытаюсь создать список, который будет использоваться как предложение in для оператора select. Требуется, чтобы пользователь вводил список описаний через запятую. Каждое описание может содержать пробелы, поэтому я не могу удалить пробелы перед разделением запятой, чтобы добавить одинарные кавычки вокруг каждого описания. Я хочу удалить все пробелы после одинарной кавычки, так как ни одно описание не будет начинаться с пробела. Какой лучший способ сделать это в VB.NET? Регулярное выражение или строковая функция? Вот что у меня пока так.

Partial Class Test
    Inherits System.Web.UI.Page

    Protected Sub cmdGetParts_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdGetParts.Click
        Dim sDescriptionList As String = ""
        BuildList(sDescriptionList)
        RemoveSpacesFromList(sDescriptionList)
        FillGrid(sDescriptionList)
    End Sub

    'Build descriptions List based on txtDescriptionList.Text
    Private Sub BuildList(ByRef sDescriptionList As String)
        Dim sDescriptionArray As String()
        sDescriptionArray = txtDescriptionList.Text.Trim.Split(","c)
        Dim iStringCount As Integer = 0
        For Each description In sDescriptionArray
            If iStringCount > 0 Then
                sDescriptionList = sDescriptionList & ","
            End If
            sDescriptionList = sDescriptionList & "'" & description & "'"
            iStringCount = iStringCount + 1
        Next
    End Sub

    **'This procedure removes unwanted spaces from  description list
    Private Sub RemoveSpacesFromList(ByRef sList As String)
        sList = sList.Replace("' ", "'")
    End Sub**

    'This procedure fills the grid with data for descriptions passed in
    Private Sub FillGrid(ByVal sDescriptionList As String)
        Dim bo As New boPart
        Dim dtParts As Data.DataTable
        dtParts = bo.GetPartByDescriptionList(sDescriptionList)
        GridView1.DataSource = dtParts
        GridView1.DataBind()
    End Sub
End Class 

Отредактировано: после просмотра этого кода я думаю, что я могу просто разместить description.Trim внутри цикла For Each процедуры BuildList.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2009

Пока вы не можете вставить одинарные кавычки, следующее должно сделать трюк

Dim replaced = Regex.Replace(input, "'\s+", "'")

Строка регулярного выражения '\s+ будет соответствовать любой одинарной кавычке, за которой следует один или несколько пробельных символов. Все экземпляры этого матча будут заменены одинарной кавычкой.

1 голос
/ 17 апреля 2009

Используйте регулярное выражение для сопоставления запятой с любым окружающим пробелом и замените апостропами и запятой. Начальный апостроп для первого элемента и конечный апостроф для последнего элемента, который вы просто добавляете потом.

Метод RemoveSpacesFromList больше не нужен, так как метод BuildList делает все это.

Protected Sub cmdGetParts_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdGetParts.Click
    Dim descriptions As String = txtDescriptionList.Text
    descriptions = BuildList(descriptions)
    FillGrid(descriptions)
End Sub

''//Build descriptions List based on a comma separated string
Private Function BuildList(ByVal descriptions As String) As String
   Return "'" + Regex.Replace(descriptions, "\s*,\s*", "','", RegexOptions.Compiled) + "'"
End Function

Примечание:
Если вы используете эту строку для построения SQL-запроса, ваше приложение широко открыто для атак с использованием SQL-инъекций. Использование параметризованных запросов является предпочтительным методом, но это может быть неудобно в вашем случае. Пользовательский ввод должен быть как минимум очищен перед использованием в запросе.

Edit:
Если адаптер использует апострофы в качестве escape-символа в строковом литерале, вы можете правильно экранировать строку следующим образом:

Private Function BuildList(ByVal descriptions As String) As String
   Return "'" + Regex.Replace(descriptions.Replace("'","''"), "\s*,\s*", "','", RegexOptions.Compiled) + "'"
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...