如何使用具有多个值的环理,它们所基于的

How can I use lookarounds in with multiple values upon which they operate

提问人:Eric Movsessian 提问时间:3/23/2023 最后编辑:marc_sEric Movsessian 更新时间:3/24/2023 访问量:55

问:

我有以下正则表达式

^(?'a'month[s]?|day[s]?|year[s]?)*\s*(?'b'month[s]?|day[s]?|year[s]?)*(?<!\k<a>|\k<a>s)$

我的意见是:

days day

我的目标是匹配,等等。day monthyear day

但不匹配 , , 等。days dayday daysdays days

所以它做得很好,但是,它匹配了这是不正确的。days day

我在想,如果在我的回溯中,我可以以某种方式说,如果它操作的值(在这种情况下,或者它与连接的值)并且表达式不等于捕获组和捕获组连接的值,这将解决问题daysaas

C# .NET 正则表达式

评论

1赞 Wiktor Stribiżew 3/23/2023
^(?'a'month|day|year)s?\s*(?!\k<a>)(?'b'month|day|year)s?$

答:

1赞 Wiktor Stribiżew 3/24/2023 #1

您可以使用 lookahead 来限制第二个组模式:

^(?'a'month|day|year)s?\s*(?!\k<a>)(?'b'month|day|year)s?$

请参阅正则表达式演示

细节

  • ^- 字符串的开头
  • (?'a'month|day|year)- 组别 : , 或amonthdayyear
  • s?- 一封可选的信s
  • \s*- 零个或多个空格
  • (?!\k<a>)- 紧挨着右侧的文本不能是组中捕获的文本a
  • (?'b'month|day|year)s?- 组 - 或 -,然后是可选的字符bmonthdayyears
  • $- 字符串末尾。
1赞 sln 3/24/2023 #2

您的正则表达式的任何部分都不需要匹配。
您的命名组是量化的。我想知道你是不是故意的。

下面的正则表达式假设只有两种形式的不能成立。

此正则表达式假定您需要 ab 组中的一个。

^(?'a'(?:month|day|year)s?)\s*(?'b'(?:month|day|year)s?)(?<!days?\s*days?)$

https://regex101.com/r/qRKLzs/1

此正则表达式假定 ab 组都是可选的。

^(?'a'(?:month|day|year)s?)?\s*(?'b'(?:month|day|year)s?)?(?<!days?\s*days?)$

https://regex101.com/r/0DkGSa/1

请注意,如果在多行选项上下文
中使用这些正则表达式,则应考虑更改为水平空格含义。
\s

喜欢这个

^(?'a'(?:month|day|year)s?)?[^\S\r\n]*(?'b'(?:month|day|year)s?)?(?<!days?[^\S\r\n]*days?)$

https://regex101.com/r/YgZI40/1