假设此模式替换字符串中的所有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,没有人是正确的。
有没有针对这种情况的特定规则?
答案 0 :(得分:1)
根据您的要求,似乎不需要捕获剩余的组,因此可以为它们使用非捕获组。
尝试一下:
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_
答案 1 :(得分:1)
由于只需要与完整URL匹配的组,因此将所有内部括号转换为non-capture groups:将()
转换为(?:)
。您可能还需要将域直接集成到模式中:
([\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
中。或根据需要将$2
组中的其余URL转换为非捕获组。