Regex:每一个组都是可选的,至少要有一个组存在,之后任何其他组都是允许的。

问题描述 投票:0回答:1

这种情况几乎就像在 Regex:个别可选的捕获组,但集体至少必须存在一个。但有一个转折,使得那里的解决方案无法使用--旧的解决方案依赖于字符串的末端在可选组之后。

我正在检查我们从外部输入的数据是否有效。有三个元素,我们称它们为T、N和M,其中至少有一个必须出现在字符串的开头。有可能两个或三个都存在。顺序是规定的。而在我所要求的元素出现后,其他任何元素也可能出现,但不是原始元素之一(变体:后面的可选尾巴必须以一个定义组的字符开始,而这个组不包括T、N或M字符)。元素之前、元素之间、元素之后都可以有空格。

(我称它们为 "元素",每个元素都是一个子串,我有一个有效的regex,我将把它作为一个组来插入--但在这里的例子中,我将只使用字符T、N和M作为占位符)。

根据另一个问题,我试着使用负向的lookahead,但问题是我不能指定字符串的结尾。

(?!$)(T?)(N?)(M?)$。

这不符合以下情况 TNL1 哪些是有效的(我的开头有一个T和N,所以我不在乎后面是否有一个L1)。

(?!$)(T?)(N?)(M?)

除了空字符串之外,这符合任何东西,例如 L1 仅限。

一些有效的测试案例是 T, N, M, TM, T N, TM and something else. 一些无效的测试用例是。only other stuff, MNT, other beginning, then TNM, ``

什么是一个合适的regex来检查我的字符串中哪些是有效的?

regex optional
1个回答
1
投票

试试吧 ^(?=[ ]*[TNM])(?:[ ]*T)?(?:[ ]*N)?(?:[ ]*M)?[ ]*(?:(?>[^TNM\s])|$).*$

或用函数代换

^(?=[ ]*(?:(?&T)|(?&N)|(?&M)))(?:[ ]*(?&T))?(?:[ ]*(?&N))?(?:[ ]*(?&M))?[ ]*(?:(?>(?!(?:(?&T)|(?&N)|(?&M)|\s)).)|$).*$(?(DEFINE)(?<T>T)(?<N>N)(?<M>M))

演示演示2

© www.soinside.com 2019 - 2024. All rights reserved.