正则表达式:每个组都是可选的,在允许其他任何条件之后,至少必须存在一个组

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

这几乎与Regex: individually optional capture groups, but collectively at least one must exist中的情况类似,但有一种扭曲,使得该解决方案无法使用。旧解决方案依赖于可选组之后的字符串结尾。

我正在检查我们从外部来源获取的数据是否有效。有三个元素,我们称它们为T,N和M,其中至少一个必须出现在字符串的开头。可能存在两个或三个。该命令是规定的。在出现了我需要的元素之后,其他任何内容也可能出现,但不是原始元素之一(变化:此后出现的可选尾部必须以已定义组中的字符开头,并且该组不包括T,N或M个字符)。元素之前,元素之间以及之后可以有空格。

(我称它们为“元素”,每个元素都是一个子字符串,为此我有一个有效的正则表达式,我会将其作为一个组插入-但在此示例中,我将仅使用字符T,N和M作为占位符)。

另一个问题,我尝试使用否定的前瞻,但是问题是我无法指定字符串的结尾。

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

这与有效的情况(例如TNL1不匹配(我开头有T和N,所以我不在乎L1是否在后面)]

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

这将匹配空字符串以外的所有内容,例如仅L1

一些有效的测试用例是:TNMTMT NTM and something else。一些无效的测试用例是:only other stuffMNTother beginning, then TNM,``

检查我的哪些字符串有效的正确的正则表达式是什么?

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))

[demodemo2

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