C# Regex:用分号分隔的域

C# Regex:用分号分隔的域,c#,.net,regex,C#,.net,Regex,我需要一个正则表达式,用于具有以下结构的C#应用程序: 用分号分隔的域 有效示例: domain1.com;domain2.org;subdomain.domain.net 如何使用单个正则表达式实现此目的?使用此正则表达式: [^\;]+ [^\;]+ 使用这个: [^\;]+ [^\;]+ 可以试试 ^([^\.;]+\.[^\.;]+;)*$ 根据您是否需要特定域名,您可能需要对其进行更改 ^([^\.;]+\.[^\.;]+;)*$ 根据您是否需要特定的域名,您可能需要对其进行

我需要一个正则表达式,用于具有以下结构的C#应用程序:

  • 用分号分隔的域
有效示例:

domain1.com;domain2.org;subdomain.domain.net
如何使用单个正则表达式实现此目的?

使用此正则表达式:

[^\;]+ [^\;]+ 使用这个:

[^\;]+ [^\;]+ 可以试试

^([^\.;]+\.[^\.;]+;)*$
根据您是否需要特定域名,您可能需要对其进行更改

^([^\.;]+\.[^\.;]+;)*$

根据您是否需要特定的域名,您可能需要对其进行更改

鉴于我对regex的厌恶,我不得不发布一个替代方案(取决于这样一个事实,即您将在某个时候需要单独的域表示作为单独的实体):

其中,
delimited
是所述格式的域字符串,其结果是找到的每个域条目的数组


很可能您的场景中有更多的案例,而不是具体的细节,但是,如果这是您的目标和输入的范围,那么这应该足够了。

鉴于我对regex的厌恶,我不得不发布一个替代方案(这取决于这样一个事实,即在某个时刻,您将需要将各个域表示作为单独的实体):

其中,
delimited
是所述格式的域字符串,其结果是找到的每个域条目的数组

很可能您的场景中有更多的案例,而不是详细的案例,但是,如果这是您的目标和输入的范围,那么这就足够了。

只要:

var domains = example.Split(";".ToCharArray(), 
                  StringSplitoptions.RemoveEmptyEntries);
只是:

您可以使用[^;]+,但C#有一个拆分函数,可以很好地解决这个问题(如果您可以避免使用正则表达式,我会这样做)

您可以使用[^;]+,但C#有一个拆分函数,可以很好地解决这个问题(如果您可以避免使用正则表达式,我会这样做)


根据失望先生的建议,我不知道所有的Uri.IsWellFormedUriString方法都有什么作用,但从理论上讲,如果您想在一个过程中同时执行这两个步骤(分离和验证),我想您可以使用LINQ来执行以下操作:

(编辑此文件以使用Uri.CheckHostName而不是Uri.IsWellFormedUriString)


使用失望先生的建议,我不知道所有的Uri.iswellFormedUrString方法都做了什么,但是,从理论上讲,如果您想在一个过程中执行这两个步骤(分离和验证),我认为您可以使用LINQ来做类似的事情:

(编辑此文件以使用Uri.CheckHostName而不是Uri.IsWellFormedUriString)



我已经看到了这个解决方案,但我需要一些更漂亮、更优雅的东西,比如正则表达式。@Esteban Lopez:在一句话中使用pretty和deletate在提到正则表达式时是完全不可接受的。使用正则表达式来解决这个问题,并且只有这个问题,只能归结为使用大锤来敲碎一颗坚果。使用正则表达式只是为了让它变得“漂亮”当某些东西已经简单而优雅时,这是一个可怕的想法。@jlafay:这个方法没有重载,它只需要一个简单的字符并使用
StringSplitOption
;这就是为什么我使用
.tocharray()
here@jlafai:我需要两个正则表达式,一个用于分隔符,另一个用于验证域,但我希望您能在一句话中提供所有内容,或帮助我。我能做什么?在域中进行拆分和拆分后?这是一个可怕的想法。我已经看到了该解决方案,但我需要更漂亮、更简单的解决方案egant,就像一个正则表达式。@Esteban Lopez:在一句话中使用pretty and Grate雅是不可接受的,当提到正则表达式时。使用正则表达式来表示这个,并且只有这个,只能归结为使用大锤来敲碎一个坚果。使用正则表达式只是为了使它“漂亮”当某些东西已经简单而优雅时,这是一个可怕的想法。@jlafay:这个方法没有重载,它只需要一个简单的字符并使用
StringSplitOption
;这就是为什么我使用
.tocharray()
here@jlafai:我需要两个正则表达式,一个用于分隔符,另一个用于验证域,但我希望您能在一句话中提供所有内容,或者帮助我。您能做什么?域中的拆分和拆分后的拆分?这是一个可怕的想法。Regex功能强大,有强大的功能就有很好的机会搞乱使用split。我希望合并^([^\.;]+\.[^\.;]+;)*$(分隔符)和^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\)+[a-zA-Z]{2,6}$(域验证)@Esteban Lopez:验证域实体已经完成了,我敢肯定你可以使用.NET的
Uri.CheckHostName
方法,一旦你获得了它们中的每一个。Regex是强大的,强大的功能带来了很好的机会来搞乱事情。使用split。我希望合并^([^\.]+\.[^\.]+.*$(分隔符)和^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\)+[a-zA-Z]{2,6}$(域验证)。@Esteban Lopez:验证域实体已经完成了,我敢肯定一旦获得了它们,您就可以使用.NET的
Uri.CheckHostName
方法。
有些人遇到问题时,会想“我知道,我会使用正则表达式。”现在他们有两个问题。
请参见:
有些人在遇到问题时会认为“我知道,我会使用正则表达式。”。“现在他们有两个问题。
请参阅:
IsWellFormedUriString
在这种情况下不起作用,因为域没有协议前缀。感谢您指出这一点。我已经编辑了更多内容(我认为)你原来是在建议。新版本可以将这两个步骤合并为一个步骤吗?我想是的,如果
x
的任何单个值导致
CheckHostName
引发异常,那么它也会破坏整个例程。这是一个很好的观点,但从MSDN(),看起来该方法在val出现问题时不会引发异常