我有一个字符串管道'|'分隔。我需要一个正则表达式来根据管道字符验证项目数。所以正则表达式将执行以下操作:
如果最大项目数为3:
asdfasdf | asdfasdf | asdfasdf = VALID
asdfasdf | asdfasdf | asdfasdf | asdfasf =无效
此外,此字符串可能为空。
非常感谢任何帮助
此致
答案 0 :(得分:7)
^(?:[^|]+(?:\|[^|]+){0,2})?$
这将匹配一个空字符串或最多三个管道分隔的项目,其中一个项目可以是管道以外的任何字符。在这种模式中,每个项目至少需要一个字符;如果您想允许空白项目,请将+
更改为*
s。
如果您想更改允许的项目数上限,请将{0,2}
更改为{0,max-1}
,其中max
是您想要的限制(因为您最多会有max - 1
{1}}字符串中的管道,以使其有效)。
答案 1 :(得分:3)
您使用的是任何编程语言吗?如果是这样,它可能具有特定的功能。如果可以避免的话,使用正则表达式来处理所有字符串是不好的。
PHP:
$items = explode('|', $mystr);
if ($items > $max) failed
的Python:
items = mystr.split('|')
if len(items) > max: failed
答案 2 :(得分:1)
为什么要使用正则表达式?只需迭代字符串并计算每个管道。这实际上正在做正则表达式所做的事情,但不必保持所有的模式匹配bookeeping。
答案 3 :(得分:0)
这里最容易计算|
个字符。 E.克。在PowerShell中:
PS> $valid = 'asdfasdf|asdfasdf|asdfasdf'
PS> $notvalid= 'asdfasdf|asdfasdf|asdfasdf|asdfasf'
PS> ($valid.ToCharArray() | where {$_ -eq '|' }).Count -lt 3
True
PS> ($notvalid.ToCharArray() | where {$_ -eq '|' }).Count -lt 3
False
答案 4 :(得分:0)
^[^|]*(?:\|[^|]*){0,2}$
这假设管道之间的项目可能为空。
答案 5 :(得分:0)
^([^|]*\|){0,2}[^|]*$
允许空字符串项目,最多三项,更改0
或2
以更改最小/最大范围。