正则表达式匹配字符串中任意位置的多个字符串

Regex to match for multiple strings anywhere within a string

我正在尝试使用 Regex 在 ASP.NET 中添加一些验证。本质上,我需要确保文本框包含 ***ThisString*** 和 ***ThatString***,包括星号。

我可以让它与一个或另一个一起工作,只是不能同时出现在 string.l 它正在验证的任何部分。

谢谢

正如三聚氰胺正确指出的那样,如果其中一个字符串有多个而另一个字符串没有,我的解决方案将不起作用。如果可能发生这种情况,为了便于阅读,您可以分别检查每个字符串

  • 第一个正则表达式- (?:\*{3}ThisString\*{3})

  • 第二个正则表达式- (?:\*{3}ThatString\*{3})

如果在两种情况下都找到匹配项,那么您就可以开始了!

原答案:-

这是你想要的正则表达式:(?:\*{3}(?:ThisString|ThatString)\*{3})

注意:确保启用全局匹配并确保正确转义星号。

如果上述表达式找到 2 个(或更多)匹配项,则表示您可以开始了。

解释:-

  • 整个东西都在一个非捕获组中,这是为了确保里面的所有东西都得到完全匹配
  • 弦的每一侧有 3 颗星,一侧有 3 颗星而另一侧没有将 不会 匹配
  • ThisStringThatString 都在一个分组的替代方案中,这是为了减少混乱,你可以完全堵塞所有可能的位置模式,但这样更好,因为位置在这里无关紧要。 ***ThatString*** 可以在 ***ThisString*** 之前,反之亦然。

确定检查找到的匹配项的长度,长度必须是 2 描述的条件要满足。

这是live demo

根据@Chase 的回答,我得出以下结论:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    Regex thisString = new Regex("(?:\*{3}ThisString\*{3})");
    Regex thatString = new Regex("(?:\*{3}ThatString\*{3})");

    if (!thisString.IsMatch(value.ToString()) || !thatString.IsMatch(value.ToString()))
    {
        return new ValidationResult("***ThisString*** and ***ThatString*** are used to generate the email text. Please ensure the text above has both ***ThisString*** and ***ThatString*** somewhere within the text.");        }

    return  ValidationResult.Success;
}

现在,如果任一正则表达式模式在任何地方都不匹配,它将 return 出错。