Как инвертировать логику захвата группы регулярных выражений? - PullRequest
0 голосов
/ 13 ноября 2018

Чтобы создать группу захвата в регулярном выражении, вы используете (match) и добавляете к ней префикс ?:, чтобы сделать ее не захватывающей, например (?:match). Дело в том, что в любом сложном регулярном выражении я хочу создать гораздо больше групп без захвата, чем групп захвата, поэтому я бы хотел изменить эту логику и захватывать только группы, начинающиеся с ?: (или что-то еще). Как я могу это сделать? В основном я использую регулярные выражения с .NET, но я не возражаю против ответов на другие языки с регулярными выражениями, такими как Perl, PHP, Python, JavaScript и т. Д.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

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

my $string = q(Available from v5.10 in Perl.);

$string =~ /([A-Z].+?)(?<v>[0-9.]+)\s+(.*?)\./;

say "Version: $+{v}";

После регулярного выражения захват доступенв %+ хэше, внутри регулярного выражения в \k<name> или \g{name}.

Недостатком является то, что вы все еще захватываете все эти другие вещи (что немного вредит эффективности), в то время как преимущество заключается в том, что вы все ещезахватить все эти другие вещи (что помогает гибкости, если некоторые из них превращаются необходимыми).

0 голосов
/ 13 ноября 2018

Если вы хотите избежать неуклюжести (?: ) и превратить группы ( ) в группы без захвата, используйте параметр RegexOptions.ExplicitCapture.При использовании этой опции будут захвачены только именованные группы ((?<name>subexpression)).

Однако, к сожалению, нельзя превратить группы без захвата (?: ) в группы захвата.

RegExконструктор, а также другие методы класса RegEx принимают RegexOptions flags.

Например:

Regex.Matches(input, pattern, RegexOptions.ExplicitCapture)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...