2015-10-26 3 views
1

Я пытаюсь создать регулярное выражение, которое может идентифицировать число в пределах интервала в строке в VBA. Иногда у этого числа есть символы вокруг него, иногда нет (несогласованная нотация от поставщика). Выражение должно идентифицировать, что 1413 в трех приведенных ниже примерах находится в пределах диапазона 500-2000 (или, альтернативно, это не в диапазоне чисел 0-50 или 51-499).регулярное выражение с возможными символами до и после номера VBA

Пример:

  • Test 12/2014. Tot.flow:1413 m3 или
  • Test 12/2014. Tot.flow:1413m3 или
  • Test 12/2014. Tot.flow: 1413

эти строки имеют некоторые идентификаторы:

  • всегда будет С Olon перед номером
  • может быть белое пространство между двоеточием и номером
  • может быть белое пространство между числом и m3
  • m3 не обязательно всегда присутствует, и если нет, то количество находится в конце строки

до сих пор, что у меня в попытке сделать регулярное выражение, найти диапазон число ([5-9][0-9][0-9]|[1]\d{3}|2000), но это соответствует все трехзначные числа, а (2001 дает матч на 200) , Тем не менее, я понимаю, что я упускаю пару концепций, чтобы достичь конечной цели здесь. Я предполагаю, что мои проблемы являются следующие:

  1. Как начать интервал на то, что не ноль (найдено много вопросов на интервалах, начиная с нуля)
  2. Как принимать во внимание различия в обозначениях и для flow: и m3?

Я только заинтересован в проверке того, что число лежит в пределах диапазона номеров. Это приводит меня в бешенство, вся помощь очень ценится!

+0

Вы можете просто извлечь номер с 'regExp.Replace()' с помощью '^ *:. \ s * (\ d +). * $ 'и' $ 1', а затем используйте регулярное сравнение целочисленного числа, чтобы проверить, находится ли значение в ожидаемом диапазоне. –

+0

@stribizhev Не могли бы вы дополнительно объяснить замену '$ 1'? – Holene

+1

'$ 1' - это обратная ссылка на текст, захваченный первой группой захвата (т. Е. Подшаблон' (...) '). –

ответ

2

Вы можете просто извлечь номер с regExp.Replace(), используя следующее регулярное выражение:

^.*:\s*(\d+).*$ 

Замещение часть $1.

Затем используйте обычное числовое сравнение, чтобы проверить, находится ли значение в ожидаемом диапазоне (например, If CLng(result) > 499 And If CLng(result) < 2001 Then ...).

Тест макро:

Dim повторно Как RegExp, TGT As String, ЦСИ As String

Set re = New RegExp 
With re 
    .pattern = "^.*:\s*(\d+).*$" 
    .Global = False 
End With 
src = "Test 12/2014. Tot.flow: 1413" 
tgt = re.Replace(src, "$1") 
MsgBox (CLng(tgt) > 499 And CLng(tgt) < 2001) 
1

Вы можете попробовать:

:\s?([5-9]\d\d|1\d{3}|2000)\s?(m3|\n) 

также, ваше регулярное выражение ([5-9][0-9][0-9]|[1]\d{3}|2000) на мой взгляд, это хорошо, это не должно соответствовать номерам> 500 и 2000 <.

Смежные вопросы