【问题标题】:Regular Expression in Bash ScriptBash 脚本中的正则表达式
【发布时间】:2013-06-06 08:38:57
【问题描述】:

你好很棒的社区,

说到正则表达式,我完全是个笨蛋。我已经推迟了学习它......现在我的懒惰已经赶上了我。

我想做什么:
检查字符串是否匹配此格式:

10_06_13

即。今天的日期,或带有“2digits_2digits_2digits”的类似日期

我做了什么:

regex='([0-9][0-9][_][0-9][0-9][_][0-9][0-9])'
if [[ "$incoming_string" =~ $regex ]]
then
   # Do awesome stuff here
fi

这在一定程度上有效。但是当传入的字符串等于011_100_131 ...它仍然通过正则表达式检查。

如果有人能帮助我指明正确的方向,我将不胜感激。
干杯

【问题讨论】:

  • 请注意,下划线不需要放在方括号中。 _ 与 [_] 匹配。
  • 011_100_131 与您的正则表达式不匹配。 011_10_131 会。

标签: regex linux bash expression


【解决方案1】:

=~ 如果左侧的字符串包含 与右侧的正则表达式匹配,则成功。如果您想知道字符串 是否与 正则表达式匹配,则需要在正则表达式的两侧“锚定”,如下所示:

regex='^[0-9][0-9][_][0-9][0-9][_][0-9][0-9]$'
if [[ $incoming_string =~ $regex ]]
then
  # Do awesome stuff here
fi

^ 只在字符串开头成功,$ 只在结尾成功。

注意事项:

  1. 我从正则表达式中删除了不必要的(),并从[[ ... ]] 中删除了""。
  2. bash 手册措辞不佳,因为它说=~ 如果字符串匹配则成功。

【讨论】:

  • 该死,我离得太近了!我假设 '^' 是为了排除字符。非常感谢! :)
  • @Robbie: ^ 在字符集中 ([...]) 中的第一件事时表示“排除”,在模式中的第一件事时表示“锚定”。否则,它只会匹配^(但在所有正则表达式实现中并非如此;有时它的意思是“匹配一行的开头”)。我同意在你习惯之前它会让人感到困惑。
  • 如上所述,您可以将[_] 替换为_,而无需更改正则表达式匹配的内容。
猜你喜欢
  • 2011-11-01
  • 2019-09-15
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多