Получить первую букву каждого слова в строке и объединить в новое слово с помощью Regex - PullRequest
2 голосов
/ 30 сентября 2019

Я не знаю, как получить все первые сопоставленные буквы из совпадений регулярных выражений. Я пытаюсь расширить свои знания и использование регулярных выражений.

Код, который я показываю ниже, делает именно то, что я хочу, однако я хотел бы иметь возможность делать то же самое с помощью регулярных выражений. Код регулярного выражения, который я пробовал, хорошо совпадает с первой буквой каждого слова, по одному слову за раз, но я хотел бы получить все первые буквы сразу без зацикливания.

If Not myString.Contains("/") And myString.ToUpper() = myString Then
    Dim words As String() = myString.Split(" "c)
    Dim initials As String = ""
    For Each Word As String In words
        initials &= Word(0)
    Next
    DGV1(1, i).Value = initials
End If

Регулярное выражение, которое яя пробовал, что соответствует одной букве за раз: Моя строка (myString) выглядит так: DEL REY name CLUB

Dim initial As String = Regex.Match(myString, "\b[a-z][A-Z]")

Из показанного примера кода регулярного выражения я хотел бы показать первые буквы DRnC в DataGridViewячейка так же, как метод не регулярное выражение, показанное выше.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

На мой взгляд, лучший подход - это найти все буквы первого слова и затем сопоставить результаты:

Dim results As String = String.Concat(Regex.Matches(myString, "\b\p{L}").Cast(Of Match)().Select(Function(m) m.Value).ToList())

Здесь \b\p{L} находит все вхождения любой буквы, которой не предшествует буква, цифра илипунктуация соединителя и некоторые диакритические знаки. Regex.Matches соответствует всем вхождениям в строке, затем .Cast(Of Match)().Select(Function(m) m.Value).ToList() извлекает значения соответствия в список, а String.Concat объединяет их в одну строку.

Если вы планируете использовать одно регулярное выражениевызов метода, вы можете рассмотреть Regex.Replace:

Dim results As String = Regex.Replace(text, "\P{L}*(?:(\p{L})\p{L}*|$)", "$1")

Здесь \P{L}*(?:(\p{L})\p{L}*|$) соответствует любым 0+ символам, кроме букв, затем он сопоставляет и записывает в группу 1 любую букву, а затем сопоставляет любые буквы 0+или соответствует концу строки. Замена $1 восстанавливает первую букву слова в результате.

См. Демонстрационную версию regex .

0 голосов
/ 01 октября 2019

Код здесь - очень простой ответ, который подходит для моего приложения (не такой надежный, как у Wiktor Stribizew). Моя входная строка всегда состоит из заглавных букв только потому, что я использую оператор If Not ... см. Оригинальный вопрос. Код: Dim initials As String = Regex.Replace (myString, "(\ B [AZ] [] *)", "")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...