Регулярное выражение для поиска строки определённой длины в любой строке

Нужно выбрать строку точно из 5 цифр в произвольной строке, например, в этих строках будет выдано 12345

12345
12345бла
бла*12345
бла-12345+бла

в этих строках подходящей последовательности нет

бл0а9876
987654
бла+0987654321-бла

У меня есть решение, но я хочу ещё варианты. Мой вариант (?:\D|^)(\d{5})(?:\D|$) и выбрать первую группу. FLAVOR=ECMAScript, точнее, VBScript


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Используйте

(?:\D|^)(\d{5})(?!\d)

Подробности

  • (?:\D|^) - любой символ, кроме цифры (\D), или (|) начало строки (^)
  • (\d{5}) - захватывающая подмаска №1: пять любых цифр из набора символов ASCII
  • (?!\d) - блок предварительного просмотра вперёд, который требует отсутствия цифры сразу после текущей позиции в строке (т.е. после пяти цифр не должно быть другой цифры).

Вам нужно только значение захватывающей подмаски, т.е. в VBScript нужно получить значение match.SubMatches(0).

Пример кода на VBScript:

Dim regEx As Object, Matches As Object, m As Object
Dim str As String

Dim coll As Collection
Set coll = New Collection

str = "12345 12345бла бла*12345 бла-12345+бла |||| бл0а9876 987654 бла+0987654321-бла"

Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = "(?:\D|^)(\d{5})(?!\d)"
regEx.Global = True

Set Matches = regEx.Execute(str)
If Matches.count > 0 Then
 For Each m In Matches
  coll.Add(m.SubMatches(0))
  Wscript.Echo(m.SubMatches(0))
 Next m
Else
  Wscript.Echo("Совпадений не найдено.")
End If

If coll.count > 0 Then Wscript.Echo("Кол-во совпадений: " & coll.count)

Результат:

12345
12345
12345
12345
Кол-во совпадений: 4
→ Ссылка