【问题标题】:Matching multiple different tokens in a string in any order以任意顺序匹配字符串中的多个不同标记
【发布时间】:2014-12-27 13:50:55
【问题描述】:

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

【问题讨论】:

  • 你能举个例子吗?
  • 我稍微更新了我的问题@AvinashRaj
  • @Barmar 我看到的问题是我想匹配一个两个%d令牌。
  • 您可以将其与负环视相结合,使其仅匹配指定的数字。

标签: regex


【解决方案1】:

您可以使用以下使用环视的正则表达式。

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

DEMO

说明:

  • (?!.*%[^sd]) 字符串不会包含除%d%s 以外的格式字符

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

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

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

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

  • 只有满足以上所有条件,才匹配对应的字符串。

【讨论】:

  • 我还添加了一个(?=.*%d),至少需要一个%d,但这有效,谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2014-08-20
  • 2023-02-21
  • 2017-06-12
  • 2021-09-28
  • 1970-01-01
  • 2021-04-12
相关资源
最近更新 更多