C # регулярное выражение, чтобы найти номер захваченной группы - PullRequest
0 голосов
/ 30 июня 2018

Предположим, этот шаблон для замены всех URL в строке

string domains = "(gl|me|com|ir|org|net|edu|info|me|ac|name|biz|co|pro|ws|asia|mobi|tel|eu|in|ru|tv|cc|es|de|ca|mn|bz|uk|us|au)";

string pattern = @"([\n ]|^)?(((https?|ftp)://)?(www\.)?([\w\d-]+\.)+" + domains + @"([/][\w\d_~:?#@!%$&'()*+,;=`\[\]\.\-]+)*)([\n ]|$)?";

Я хочу заменить все URL тегом _URL_, но оставить разделители слева и справа от строки.

Как я знаю, $1 относится к ([\n ]|^)? в начале шаблона, но я не смог найти правильное число для ([\n ]|^)? в конце шаблона!

Regex.Replace(data, pattern, "$1_URL_$?"); // what should be replaced by ?

Я проверил на $ 2- $ 8, и никто не был прав.

Есть ли какое-то конкретное правило для таких ситуаций?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Поскольку вам нужна только группа, которая соответствует полному URL, преобразуйте все внутренние скобки в группы без захвата : () в (?:). Вы также можете интегрировать домены непосредственно в шаблон:

([\n ]|^)?((?:(?:https?|ftp)://)?(?:www\.)?(?:[\w\d-]+\.)+(?:gl|me|com|ir|org|net|edu|info|me|ac|name|biz|co|pro|ws|asia|mobi|tel|eu|in|ru|tv|cc|es|de|ca|mn|bz|uk|us|au)(?:[/][\w\d_~:?#\@!%$&'()*+,;=`\[\]\.\-]+)*)([\n ]|$)?

Передний якорь затем фиксируется в $1, а задний якорь в $3. Или, если хотите, преобразуйте оставшийся URL-адрес в группе $2 в группу без захвата.

Демо

0 голосов
/ 30 июня 2018

Судя по вашему требованию, вам не нужно захватывать оставшиеся группы, поэтому вы можете использовать для них группы без захвата.

Попробуйте это:

string pattern = @"([\n ]|^)?(?:(?:(?:https?|ftp)://)?(?:www\.)?(?:[\w\d-]+\.)+" + domains + @"(?:[/][\w\d_~:?#@!%$&'()*+,;=`\[\]\.\-]+)*)([\n ]|$)?";

и

string domains = (?:gl|me|com|ir|org|net|edu|info|me|ac|name|biz|co|pro|ws|asia|mobi|tel|eu|in|ru|tv|cc|es|de|ca|mn|bz|uk|us|au)

и затем вы можете просто использовать $2 для второй группы

Более того, я бы предложил вам просто использовать одну группу захвата и заменить ее _URL_

Демо: https://regex101.com/r/UjyOKU/2

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