【问题标题】:Regex to match a "PATH environment variable" like String正则表达式匹配“PATH 环境变量”,如字符串
【发布时间】:2013-04-16 08:10:46
【问题描述】:

我正在尝试检查字符串是否形成为NAME1=VALUE1;NAME2=VALUE2;

这是我目前发现的:

s.matches("^(.+=.+;)*$")

但棘手的部分是:最后一个分号不是强制性的。所以必须接受像NAME1=VALUE1;NAME2=VALUE2 这样的字符串。

有人有想法吗?

【问题讨论】:

  • @MarounMaroun 不是真的。首先是? 而不是*。其次,重复相同的表达式,他只希望最后一个是可选的。

标签: java regex regex-negation


【解决方案1】:

您的表达式并没有真正达到预期的效果,因为一方面是贪婪的量词,另一方面是因为您使用的点几乎允许任何字符。
这应该具有您所期望的行为:

^(\w+=\w+;)*\w+=\w+;?$

或者,如果一个空字符串是正确的:

^(\w+=\w+;)*(\w+=\w+;?)?$

请注意,我使用 \w 只是作为限制示例。

【讨论】:

  • 您可以将(\w+=\w+;?)? 简化为(\w+=\w+;)?,因为可选的; 仅通过将该术语设为可选来涵盖。
  • @Dukeling 不,如果您进行更改,您将失去; 是可选的这一事实。
  • 正是我想要的。非常感谢!
  • 我的错,实际上是(\w+=\w+;?)?(\w+=\w+)?。请参阅this 以获得一点证明。
  • @Dukeling 这个是正确的,是的。虽然它不应该改变性能。
【解决方案2】:

你可以试试那个:

^([^=]+=[^;]+;)*([^=]+=[^;]+;?)$

自“.”以来,您的正则表达式中也有一些错误。也匹配“=”。 [^=] 表示“除“=”之外的所有内容。

【讨论】:

  • 谢谢你,克里斯。这个仅适用于 X=Y; 的 2 次出现,但不适用于像 "NAME1=VALUE1;NAME2=VALUE2;NAME3=VALUE3" 这样的字符串。
  • 您需要在组之间添加一个星号。 (我编辑了答案)
【解决方案3】:

必须是正则表达式,这样可以吗:

 for (String pair : myString.split(";")){
    if (! ((pair.indexOf("=") > 0) && (pair.indexOf("=") < pair.length()) &&   
          ((myString.split("=").length - myString.split(";").length) < 2) ))
      return false;
 }
 return true;

【讨论】:

  • 对于我的问题可能有一个更优化的选项,将“检查”与“处理”混合。无论如何,上面的代码不适用于如下字符串:NAME1=VALUE1NAME2=VALUE2
猜你喜欢
  • 2016-10-22
  • 2020-05-14
  • 2012-06-05
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多