以任意顺序匹配字符串中的多个不同标记

时间:2014-12-27 13:50:56

标签: regex

我需要一种匹配“格式”字符串的方法。它应该有一个或两个%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令牌

1 个答案:

答案 0 :(得分:2)

您可以使用以下使用外观的正则表达式。

^(?!.*%[^sd])(?!.*%d.*%d.*%d)(?!.*%s.*%s)(?=.*%s)(?=.*%d).*$

DEMO

<强>解释

  • (?!.*%[^sd])字符串不包含%d%s

  • 以外的格式字符
  • (?!.*%d.*%d.*%d)字符串不会包含至少三个%d个字符。

  • (?!.*%s.*%s)字符串不会包含至少两个%s个字符。

  • (?=.*%s)字符串必须包含%s字符。

  • (?=.*%d)字符串必须包含%d字符。

  • 仅在满足上述所有条件时匹配相应的字符串。