2017-01-09 3 views
1

У меня есть шаблон регулярного выражения, который, кажется, требует пространства в нем для работы, но я не могу понять, почему. Вот тестовый метод, который я сделал, я хочу совместить символы между двумя ', но только тогда, когда он окружен другими символами и с дополнительными пробелами.Зачем этому регулярному выражению нужно пространство?

Private Sub RegexTestSub() 

    Dim testString = "Foo = ASSIGN/ 'Bar'" 

    Dim patternA = "(?<=Foo([ ]+)?=([ ]+)?ASSIGN\/([ ']+)?)[a-zA-Z0-9-_. ]+(?=([' ]+)?)" 
    Dim patternB = "(?<=Foo([ ]+)?=([ ]+)?ASSIGN\/ ([ ']+)?)[a-zA-Z0-9-_. ]+(?=([' ]+)?)" 

    Dim resultA As Match = Regex.Match(testString, patternA) 
    Dim resultB As Match = Regex.Match(testString, patternB) 

End Sub 

Оба матча, но resultB.Value равно «Бар», но resultA.Value это просто пространство. Единственное различие между шаблонами регулярных выражений - это пробел после ASSIGN\/ (о котором я знаю!) Я хочу, чтобы это пространство было необязательным, что, как я думал, достигнет ([ ']+)?.

Другие примеры, которые должны соответствуют ...

Foo=ASSIGN/'Bar' информация должна соответствовать Bar

Foo = ASSIGN/'Bar' (Может быть несколько пробелов) должны соответствовать Bar

Foo = ASSIGN/ 'Foo.Bar.Foo.A1-0' должен соответствовать Foo.Bar.Foo.A1-0

ответ

2

You первое регулярное выражение соответствует пространство, потому что выполняется условие lookbehind (этот шаблон найден прямо перед пространством) и t он смотрит - (?=([' ]+)?) - не имеет никакого значения, поскольку для этого требуется дополнительный шаблон, он может быть там или нет и, таким образом, полностью избыточен.

Я думаю, что вам нужно

(?<=Foo *= *ASSIGN/ *')[^']+ 

Смотрите regex demo

Детали:

  • (?<=Foo *= *ASSIGN/ *') - место должно предшествовать Foo, 0+ пространства, =, 0+ пробелы, ASSIGN/ и ноль или более пробелов
  • [^']+ - кроме '

Примечания что, если вам не нужно никаких пересекающихся матчей, вы можете использовать захват и использовать

Foo *= *ASSIGN/ *'([^']+) 

и захватить Группу 1 1+ символы (match.Groups(1).Value) стоимость.

Если данные могут поступать без одинарных кавычек, и вам необходимо, чтобы получить какой-либо кусок 1+ непробельных символов после этого просмотра назад, я предлагаю использовать

Foo *= *ASSIGN/ *(?:'(?<v>[^']+)'|(?<v>\S+)) 

и Грат содержимого v группы. См. this regex demo.

+0

Спасибо! Кажется, что он работает отлично и намного понятнее читать! Строка, в которой я нуждаюсь, всегда будет окружена одинарными кавычками, поэтому первый вариант будет отличным. – Notts90

+0

Я думаю, что вы можете обойтись без присмотра здесь. Просто запишите данные, которые вам нужны с помощью '(...) ' –

+0

Мне нужен внешний вид, чтобы проверить назначаемый параметр. Я разбираю язык программирования для назначения определенного параметра (в данном случае' Foo') и получая строку, назначенную параметру (всегда окруженный одинарными кавычками) – Notts90