我有一个正则表达式匹配以下内容:
somedomain.com/services/something
基本上我需要确保/服务存在。
我正在使用的正则表达式是:
\/services*
但我需要匹配/services
或/servicos
。我尝试了以下方法:
(\/services|\/servicos)*
但这显示24场比赛?! https://regex101.com/r/jvB1lr/1
如何创建此正则表达式?
答案 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
- services
或servicos
(?:/|$)
- /
或字符串结尾。答案 1 :(得分:1)
*
量词表示零或更多,这就是问题所在。删除它,它应该工作正常:
(\/services|\/servicos)
请注意,在您的示例中,您在网址中输入了一个拼写错误,因此它将无法正确匹配任何内容。
Here is an example修复了网址中的拼写错误,因此按预期显示了1个匹配项。
答案 2 :(得分:0)
首先你要在这篇文章中指定C#(真的.Net是保存正则表达式而不是语言的库),但是你的例子中的regex101设置为PHP。这将为您提供无效信息,例如需要使用/
转义正斜杠\/
,这在.Net正则表达式中是不必要的。正则表达式语言是相同的,但有不同的工具表现不同,PHP不像.Net正则表达式。
其次*
上的明星( )
表示括号中可能有无且您的匹配正在 null 没有匹配关于每一个字。
第三,一个人不需要分割整个单词。我只是将单词中的共性提取到集合[ ]
中。这将允许" or-ness"你需要匹配服务或服务。如
(/servic[oe]s)
如果找到服务,将通知您。不需要任何其他东西。