C#regex查找捕获组的数量
假设此模式用于替换字符串中的所有URLC#regex查找捕获组的数量,c#,regex,replace,C#,Regex,Replace,假设此模式用于替换字符串中的所有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_~:?#
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 ]|$)?";
我想用\uurl\ucode>标记替换所有URL,但将分隔符保留在字符串的左侧和右侧
据我所知,$1
指的是模式开头的([\n]| ^)
,但我找不到模式结尾的([\n]| ^)
的正确数字
Regex.Replace(data, pattern, "$1_URL_$?"); // what should be replaced by ?
我测试了2-8美元,没有人是正确的
对于这种情况,是否有任何特定的规则?根据您的要求,您似乎不需要捕获还押组,因此可以使用非捕获组
试试这个:
string pattern = @"([\n ]|^)?(?:(?:(?:https?|ftp)://)?(?:www\.)?(?:[\w\d-]+\.)+" + domains + @"(?:[/][\w\d_~:?#@!%$&'()*+,;=`\[\]\.\-]+)*)([\n ]|$)?";
及
然后,您只需为第二组使用$2
此外,我建议您只需使用一个捕获组,并将其替换为\uurl
演示:根据您的需求,您似乎不需要捕获还押组,因此可以使用非捕获组
试试这个:
string pattern = @"([\n ]|^)?(?:(?:(?:https?|ftp)://)?(?:www\.)?(?:[\w\d-]+\.)+" + domains + @"(?:[/][\w\d_~:?#@!%$&'()*+,;=`\[\]\.\-]+)*)([\n ]|$)?";
及
然后,您只需为第二组使用$2
此外,我建议您只需使用一个捕获组,并将其替换为\uurl
演示:由于您只需要与完整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转换为非捕获组
因为您只需要与完整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转换为非捕获组
[\w\d\u因为\w
已经包含了它,\w\d\u因为\w
已经包含了它,所以没有必要。