Что я могу сделать, чтобы предотвратить совпадение определенных символов в регулярных выражениях? - PullRequest
2 голосов
/ 02 июля 2019

Мне нужна помощь с регулярным выражением, чтобы предотвратить распознавание символов, отличных от '-' и ',' в сочетании с числами.

У меня есть поток данных, который состоит из чисел от 0 до 9, которыес запятой, но никогда не может начинаться с 0 (может содержать 10, но не 01).Некоторые из этих пакетов с разделителями могут быть расставлены через дефис.Вот примеры групп чисел:

12-34,56,78-90,12,34-45,67-8,90

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

Group 1: 12-34

Group 2: 56

Group 3: 78-90

Group 4: 12

Group 5: 34-45

Group 6: 67-8

Group 7: 90

Пока у меня есть такой шаблон:

[1-9]+\d*(?:-[1-9]+\d*)?(?=,|$)

Проблема в том, что если числа содержатложный символ, отличный от числа, '-' или ',' группа частично распознается:

12 £ 34,56,78-90,12,34-45,67-8,90

Группа 1: 34

Как это исправить?Я использую VBA для этого.Спасибо

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Вы можете использовать

(?:^|,)([1-9]\d*(?:-[1-9]\d*)?)(?=,|$)
^^^^^^^

См. Демоверсию регулярных выражений и график регулярных выражений :

enter image description here

Основным пунктом является группа (?:^|,), которая соответствует началу строки (^) или (|) запятой. Обратите внимание, что я удалил + из [1-9], чтобы уменьшить количество возвратов.

подробности

  • (?:^|,) - начало строки или ,
  • ([1-9]\d*(?:-[1-9]\d*)?) - Группа захвата 1 (доступ к ней через match.Submatches(0)):
    • [1-9]\d* - цифра от 1 до 9, а затем любые 0+ цифр
    • (?:-[1-9]\d*)? - необязательная последовательность -, цифра от 1 до 9, а затем любые цифры 0+
  • (?=,|$) - запятая или конец строки.

VBA тест:

Sub Test()
Dim val As String, rx As New regExp
Dim ms As MatchCollection, m As Match

val = "12L34,56,78-90,12,34-45,67-8,90"
Set rx = New regExp
rx.Pattern = "(?:^|,)([1-9]\d*(?:-[1-9]\d*)?)(?=,|$)"
rx.Global = True
Set ms = rx.Execute(val)
If ms.Count() > 0 Then
 For Each m In ms
   Debug.Print m.SubMatches(0)
 Next
End If

End Sub

Выход:

enter image description here

0 голосов
/ 02 июля 2019

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

^(\d+-\d+|(?:\d+\D)\d+),(\d+),(\d+-\d+|(?:\d+\D)\d+),(\d+),(\d+-\d+|(?:\d+\D)\d+),(\d+-\d+|(?:\d+\D)\d+),(\d+)$

, чтобы, возможно, выполнить ваши требования к группировке от 1 до 7, и вы можете добавить дополнительную группу для тех \D символов, которые могут быть в любом месте ваших строк.

DEMO

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