Как найти слова по обе стороны (периода)

-6

в следующих примерах мне нужно получить слова по обе стороны от периода

Я использую это регулярное выражение

Dim myRegex As New Regex("[^\w]+")
Dim mymatch As String() = myRegex.Split(currentField)

где в качестве currentfield = один из следующих 3 выборок

  Contacts.Address2 as 'Contact Address2'
Contacts.ContactID
CONCAT(Contacts.FirstName;;' ';;Contacts.LastName) as 'Contact'

Возврат выглядит следующим образом.

1-- Контакты, Address2, as, Contact и Address2 не хотят, чтобы слово as.

2-- Контакты и ContactID это нормально.

3-- CONCAT, Контакты, FirstName, Контакты, LastName, as и Contact.

Третий, это слишком много, чтобы не хотеть CONCAT, как или Contact. Я хочу, чтобы возвращались только четыре слова (до и после периода) Контакты, Имя, Контакты и Фамилия

как я могу написать регулярное выражение, чтобы получить только слова до и после периода

спросил(а) 2021-01-25T12:50:24+03:00 4 месяца, 3 недели назад
1
Решение
64

Я бы рассмотрел сопоставление vs. split ting:

For Each m As Match In Regex.Matches(input, "(\w+)\.(\w+)")
Console.WriteLine(
String.Join(", ",
m.Groups(1).Value,
m.Groups(2).Value
))
Next

Это пример. Непонятно, что вы ожидаете от возвращаемых результатов.

Идеальная демонстрация

ответил(а) 2021-01-25T12:50:24+03:00 4 месяца, 3 недели назад
44

Я думаю, что вы хотите только разделить внутри круглых скобок и вы не заинтересованы в слово as. Таким образом, я предлагаю двухэтапный подход:

Получить подстроку в круглых скобках (\([^()]+\) регулярное выражение) Если есть такие подстроки, разделите их на разделенное регулярное выражение, если нет, разделите исходную строку на разделенное регулярное выражение (\W+|\s*\bas\b\s* regex).

Пример кода:

'Dim currentField As String = "Contacts.Address2 as 'Contact Address2'"
Dim currentField As String = "CONCAT(Contacts.FirstName;;' ';;Contacts.LastName) as 'Contact'"
'Dim currentField As String = "Contacts.ContactID"
Dim myRegex As New Regex("\([^()]+\)")
Dim splitRegex As New Regex("\W+|\s*\bas\b\s*")
Dim mymatch As MatchCollection = myRegex.Matches(currentField)
If mymatch.Count > 0 Then
For Each match As Match In mymatch
Dim mysubstrs As String() = splitRegex.Split(match.Value)
For Each substr As String In mysubstrs
If String.IsNullOrEmpty(substr) = False Then
Console.WriteLine(substr)
End If
Next
Next
Else
Dim mysubstrs As String() = splitRegex.Split(currentField)
For Each substr As String In mysubstrs
If String.IsNullOrEmpty(substr) = False Then
Console.WriteLine(substr)
End If
Next
End If

ответил(а) 2021-01-25T12:50:24+03:00 4 месяца, 3 недели назад
45

вот окончательная рабочая процедура, основанная на принятом ответе выше

Public Sub Load_Field_List(FieldSTR As String, FieldType As String)
Dim t As New FileIO.TextFieldParser(New System.IO.StringReader(FieldSTR))
t.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
t.Delimiters = New String() {","}
Dim currentRow As String()
Dim dr As DataRow
Dim ColListSTR As String = loadeddataview.Tables(0).Rows(0).Item("ColumnList")
Dim ColListSTRArr As String() = ColListSTR.Split(",")
While Not t.EndOfData

Try
currentRow = t.ReadFields()
Dim currentField As String 'field string
For Each currentField In currentRow
Dim startName As Integer
Dim endName As Integer
Dim name As String
dr = fieldDT.NewRow
Dim isValid As Boolean = False
If currentField = "" Then 'make sure current field has data
isValid = False
ElseIf (Regex.IsMatch(currentField, "(\w+)\.(\w+)")) = True Then 'make sure current field has xxxx.yyyy pattern
Dim m As Match = Regex.Match(currentField, "(\w+)\.(\w+)") 'sets m to the first xxxx.yyyy pattern
dr("Table") = m.Groups(1).Value 'sets table column to table name xxxx
dr("Column Name") = "'" & m.Groups(2).Value & "'" 'sets column name to column yyyy enclosed in ' '
If ColListSTRArr.Contains(m.Groups(2).Value) Then 'checks columnlist str to see if column visible
dr("Show") = "True"
Else
dr("Show") = "False"
End If

' this section overrides column name if it was set using AS 'zzzzz' statement
startName = currentField.IndexOf("'")
endName = currentField.IndexOf("'", If(startName > 0, startName + 1, 0))
If (endName > startName) Then
Dim mylength As Integer = currentField.Length
name = currentField.Substring(startName, endName - startName + 1)
dr("Column Name") = name 'set override columname
dr("Field") = currentField.Substring(0, startName - 4) 'sets field minus the " as 'ZZZZZ" above
If ColListSTRArr.Contains(currentField.Substring(startName + 1, endName - startName - 1)) Then 'dup may be able to remove
dr("Show") = "True"
Else
dr("Show") = "False"
End If
Else
dr("Field") = currentField 'sets field if there was no " as 'ZZZZZZ'" in string
End If
If FieldType = "Field" Then 'sets the column linking field
dr("Linking") = "No Linking"
Else
dr("Linking") = FieldType
End If
End If
' commit changes
fieldDT.Rows.Add(dr)
fieldDT.AcceptChanges()
DataGridView3.DataSource = fieldDT
DataGridView3.ClearSelection()

Next
Catch ex As Microsoft.VisualBasic.
FileIO.MalformedLineException
MsgBox("Line " & ex.Message &
"is not valid and will be skipped.")
End Try
End While

End Sub

ответил(а) 2021-01-25T12:50:24+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема