регулярное выражение возврата условной группы - PullRequest
0 голосов
/ 20 апреля 2010

Я потратил много времени на поиски простого регулярного выражения для возврата группы (только 1-й группы).

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 20 апреля 2010

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

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

1 голос
/ 20 апреля 2010

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

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

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

/(?:Purchase of $)?([0-9.]+|No) (?:monthly maintenance|worth groceries)/
0 голосов
/ 20 апреля 2010

Я не уверен, что вы можете получить результат в группе № 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.

...