在正则表达式中使用OR

时间:2017-10-26 10:08:58

标签: c# regex

我有一个正则表达式匹配以下内容:

somedomain.com/services/something

基本上我需要确保/服务存在。

我正在使用的正则表达式是:

\/services*

但我需要匹配/services/servicos。我尝试了以下方法:

(\/services|\/servicos)*

但这显示24场比赛?! https://regex101.com/r/jvB1lr/1

如何创建此正则表达式?

3 个答案:

答案 0 :(得分:2)

(\/services|\/servicos)*匹配/services/servicos的0次出现,这意味着它可以匹配输入字符串中任何位置的空字符串。

您可以对/(services|servicos)之类的备选项进行分组并删除*量词,但对于这种情况,最好使用字符类[oe],因为字符串仅在1中不同炭。

您想使用以下模式:

/servic[eo]s

请参阅regex demo

为确保您匹配整个子部分,您可以在模式结尾(?:/|$)附加/servic[eo]s(?:/|$)

在C#中,您可以对模式使用Regex.IsMatch来查看字符串中是否存在匹配项:

var isFound = Regex.IsMatch(s, @"/servic[eo]s(?:/|$)");

请注意,您不需要在.NET正则表达式中转义/,因为它不是特殊的正则表达式元字符。

模式详情

  • / - /
  • servic[eo]s - servicesservicos
  • (?:/|$) - /或字符串结尾。

答案 1 :(得分:1)

*量词表示零或更多,这就是问题所在。删除它,它应该工作正常:

(\/services|\/servicos)

请注意,在您的示例中,您在网址中输入了一个拼写错误,因此它将无法正确匹配任何内容。

Here is an example修复了网址中的拼写错误,因此按预期显示了1个匹配项。

答案 2 :(得分:0)

首先你要在这篇文章中指定C#(真的.Net是保存正则表达式而不是语言的库),但是你的例子中的regex101设置为PHP。这将为您提供无效信息,例如需要使用/转义正斜杠\/,这在.Net正则表达式中是不必要的。正则表达式语言是相同的,但有不同的工具表现不同,PHP不像.Net正则表达式。

其次*上的明星( )表示括号中可能有且您的匹配正在 null 没有匹配关于每一个字。

第三,一个人不需要分割整个单词。我只是将单词中的共性提取到集合[ ]中。这将允许" or-ness"你需要匹配服务或服务。如

(/servic[oe]s)

如果找到服务,将通知您。不需要任何其他东西。