提问人:Eric Movsessian 提问时间:3/23/2023 最后编辑:marc_sEric Movsessian 更新时间:3/24/2023 访问量:55
如何使用具有多个值的环理,它们所基于的
How can I use lookarounds in with multiple values upon which they operate
问:
我有以下正则表达式
^(?'a'month[s]?|day[s]?|year[s]?)*\s*(?'b'month[s]?|day[s]?|year[s]?)*(?<!\k<a>|\k<a>s)$
我的意见是:
days day
我的目标是匹配,等等。day month
year day
但不匹配 , , 等。days day
day days
days days
所以它做得很好,但是,它匹配了这是不正确的。days day
我在想,如果在我的回溯中,我可以以某种方式说,如果它操作的值(在这种情况下,或者它与连接的值)并且表达式不等于捕获组和捕获组连接的值,这将解决问题day
s
a
a
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)
- 组别 : , 或a
month
day
year
s?
- 一封可选的信s
\s*
- 零个或多个空格(?!\k<a>)
- 紧挨着右侧的文本不能是组中捕获的文本a
(?'b'month|day|year)s?
- 组 - 或 -,然后是可选的字符b
month
day
year
s
$
- 字符串末尾。
1赞
sln
3/24/2023
#2
您的正则表达式的任何部分都不需要匹配。
您的命名组是量化的。我想知道你是不是故意的。
下面的正则表达式假设只有两种形式的天
不能成立。
此正则表达式假定您需要 a 和 b 组中的一个。
^(?'a'(?:month|day|year)s?)\s*(?'b'(?:month|day|year)s?)(?<!days?\s*days?)$
https://regex101.com/r/qRKLzs/1
此正则表达式假定 a 和 b 组都是可选的。
^(?'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?)$
评论
^(?'a'month|day|year)s?\s*(?!\k<a>)(?'b'month|day|year)s?$