假设此模式用于替换字符串中的所有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美元,没有人是对的。
对于这种情况有什么具体的规则吗?
发布于 2018-06-30 04:34:22
由于您只需要与完整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中捕获后锚。或者将组$2中的剩余URL转换为非捕获组,如果您愿意的话。
发布于 2018-06-30 04:27:18
从您的需求来看,您似乎不需要捕获remaning组,因此您可以为它们使用非捕获组。
试试这个:
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://stackoverflow.com/questions/51111670
复制相似问题