2010-04-19 2 views
0

Я потратил много времени на выяснение простого регулярного выражения, чтобы вернуть группу (только 1-я группа).regex return условная группа

Таким образом, строка может быть - «Никакой необходимости покупки» или «Покупка продуктов стоимостью 50 долларов США не требуется».

Я пытаюсь написать регулярное выражение, которое может анализировать «Нет» или «50» на основе данной строки.

Это то, что я написал.

(?:(No) monthly maintenance|Purchase of \$([\d\.]+ worth groceries) 

Это прекрасно работает, но я хочу, чтобы мой результат был только 1-й группой/группой 1.

+0

На каком языке вы работаете из любопытства? Может быть лучший способ справиться с этим после разбора. – gnarf

ответ

1

Почему бы не просто использовать /(?:No monthly maintenance|Purchase of $([0-9.]+) worth groceries)/.

Матч не будет выполнен, если он не находится в одном из этих форматов, а 1-я группа соответствует '' для случая «Без ежемесячного обслуживания» или номера для другого случая.

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

/(?:Purchase of $)?([0-9.]+|No) (?:monthly maintenance|worth groceries)/ 
1

Большинство языков подсчета соответствующих групп в порядке, независимо от того, они находятся в группе, не участвующей в захвате ((?:...|...)), поэтому вызывать интересную часть в первую группу захвата может быть больше проблем, чем того стоит.

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

0

Я не уверен, что вы можете получить результат в группе № 1, но вы можете получить оба результата появляются в том же имени группы. Вот пример, в PowerShell:

$input1 = 'Purchase of $50.00 worth groceries is required' 
$input2 = 'No monthly maintenance required' 

$re = '(?:(?<xyz>No) monthly maintenance|Purchase of \$(?<xyz>[\d\.]+) worth groceries)' 

$match = [regex]::Match($input1, $re) 
$match.Groups['xyz'] 

$match = [regex]::Match($input2, $re) 
$match.Groups['xyz'] 

Какие результаты в следующем:

Success : True 
Captures : {50.00} 
Index : 13 
Length : 5 
Value : 50.00 

Success : True 
Captures : {No} 
Index : 0 
Length : 2 
Value : No 

Не все языки поддерживают именованные группы, хотя. Поскольку PowerShell работает в .NET Framework, это будет работать для любого языка .NET.

+0

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

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