首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#正则表达式查找捕获组的数量

C#正则表达式查找捕获组的数量
EN

Stack Overflow用户
提问于 2018-06-30 04:16:37
回答 2查看 39关注 0票数 0

假设此模式用于替换字符串中的所有URL。

代码语言:javascript
复制
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 ]|^)?的正确编号!

代码语言:javascript
复制
Regex.Replace(data, pattern, "$1_URL_$?"); // what should be replaced by ?

我测试了2-8美元,没有人是对的。

对于这种情况有什么具体的规则吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-30 04:34:22

由于您只需要与完整URL匹配的组,所以将所有内括号转换为非俘获群()(?:)。您还可能希望将域直接集成到模式中:

代码语言:javascript
复制
([\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转换为非捕获组,如果您愿意的话。

演示

票数 1
EN

Stack Overflow用户

发布于 2018-06-30 04:27:18

从您的需求来看,您似乎不需要捕获remaning组,因此您可以为它们使用非捕获组。

试试这个:

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

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51111670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档