我需要一种匹配“格式”字符串的方法。它应该有一个或两个%d
令牌,只有一个%s
令牌。同样最好不允许任何其他格式化令牌,例如%f
等。我已经提出了一些我自己的中途解决方案,无法完成全部工作:
.*?(\%d).*(\%(?=d|s)).* //Doesn't fit requirements
.*?(\%d).*(\%d).*(\%s).* //Doesn't allow for any ordering of the tokens
我的想法也许是寻找唯一的%s
令牌并做一些外观,但我并不完全确定如何去做(正则表达式不是我最强的套装)。这是为了使用Java库,我对非正则表达式解决方案持开放态度,但正则表达式解决方案需要匹配整个字符串(我不希望在格式字符串上进行两次/三次不同的正则表达式搜索)。
例如,它应与%d:%d:%s
和%d:%s
相匹配,但不应与%d:%d:%d:%s
或%f:%d:%s
相匹配。基本上这将是字符串的要求:
%d
令牌%s
令牌答案 0 :(得分:2)
您可以使用以下使用外观的正则表达式。
^(?!.*%[^sd])(?!.*%d.*%d.*%d)(?!.*%s.*%s)(?=.*%s)(?=.*%d).*$
<强>解释强>
(?!.*%[^sd])
字符串不包含%d
或%s
(?!.*%d.*%d.*%d)
字符串不会包含至少三个%d
个字符。
(?!.*%s.*%s)
字符串不会包含至少两个%s
个字符。
(?=.*%s)
字符串必须包含%s
字符。
(?=.*%d)
字符串必须包含%d
字符。
仅在满足上述所有条件时匹配相应的字符串。