【发布时间】:2011-07-24 02:26:00
【问题描述】:
我想要一个正则表达式,如果它在字符串中有 3 个 . 实例,它会做一件事,如果它有超过 3 个实例,它会做其他事情。
例如
aaa.bbb.ccc.ddd // one part of the regex
aaa.bbb.ccc.ddd.eee // the second part of the regex
如何在js 或c# 中实现这一点?
类似
?(\.){4} then THIS else THAT
在正则表达式中...
更新
好吧,基本上我正在做的是这样的:
对于任何给定的System.Uri,我想在扩展方法中切换到另一个子域。
我遇到的问题是我的域通常是http://subdomain.domain.TLD.TLD/more/url 的形式,但有时它可能只是http://domain.TLD.TLD/more/url(它只是指向www)
这就是我想出的:
public static class UriExtensions
{
private const string TopLevelDomainRegex = @"(\.[^\.]{2,3}|\.[^\.]{2,3}\.[^\.]{2,3})$";
private const string UnspecifiedSubdomainRegex = @"^((http[s]?|ftp):\/\/)(()([^:\/\s]+))(:([^\/]*))?((?:\/)?|(?:\/)(((\w+)*\/)([\w\-\.]+[^#?\s]+)(\?([^#]*))?(#(.*))?))?$";
private const string SpecifiedSubdomainRegex = @"^((http[s]?|ftp):\/\/)(([^.:\/\s]*)[\.]([^:\/\s]+))(:([^\/]*))?((?:\/)?|(?:\/)(((\w+)*\/)([\w\-\.]+[^#?\s]+)(\?([^#]*))?(#(.*))?))?$";
public static string AbsolutePathToSubdomain(this Uri uri, string subdomain)
{
subdomain = subdomain == "www" ? string.Empty : string.Concat(subdomain, ".");
var replacement = "$1{0}$5$6".FormatWith(subdomain);
var spec = Regex.Replace(uri.Authority, TopLevelDomainRegex, string.Empty).Distinct().Count(c => c == '.') != 0;
return Regex.Replace(uri.AbsoluteUri, spec ? SpecifiedSubdomainRegex : UnspecifiedSubdomainRegex, replacement);
}
}
基本上使用此代码,我采用System.Uri 和:
- 使用
Authority属性仅获取subdomain.domain.TLD.TLD。 - 将其与“伪 TLD”相匹配(我永远不会拥有一个包含 2-3 个字母的注册域会破坏正则表达式,它基本上会检查以
.XX[X]或.XX[X].XX[X]结尾的任何内容) - 我剥离了 TLD,最终得到
domain或subdomain.domain - 如果结果数据有零个点,我使用
UnspecifiedSubdomainRegex,因为我不知道如何使用SpecifiedSubdomainRegex告诉它如果该部分没有点,它应该返回string.Empty
我的问题是,是否有办法将这三个正则表达式合并成更简单的东西
PD:忘掉javascript吧,我只是用它来测试正则表达式
【问题讨论】:
-
注意:在绝大多数情况下,要求条件正则表达式的人并不真正需要它。通常可以通过使用更简单的结构来避免它,例如交替和可选组。当然,您必须提供更多详细信息,即:“does”、“one thing”、“something else”、“THIS else THAT”和预期输出。