【问题标题】:Name check match pattern名称检查匹配模式
【发布时间】:2021-05-13 09:23:12
【问题描述】:

我需要帮助了解为什么代码 B 会产生不同的结果

x=TEST_DATA_12345678_TST_87456321

下面的代码(CODE A)产生正确的输出(匹配)

if [[ $x == TEST_[A-Z][A-Z][A-Z][A-Z]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[A-Z][A-Z][A-Z]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then echo "match"; else echo "non match"; fi

但是,下面的(代码 B)产生错误的输出(不匹配)

if [[ $x == TEST_[A-Z]{4}_[0-9]{8}_[A-Z]{3}_[0-9]{8} ]]; then echo "match"; else echo "non match"; fi

【问题讨论】:

  • 使用== 意味着它使用shell globbing 匹配。要使用正则表达式匹配,请使用=~

标签: linux bash unix


【解决方案1】:

要检查a regex in an if-statement,您需要使用=~ 而不是关闭==

#!/bin/bash

x=TEST_DATA_12345678_TST_87456321
if [[ $x =~ TEST_[A-Z][A-Z][A-Z][A-Z]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[A-Z][A-Z][A-Z]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then echo "match"; else echo "non match"; fi
if [[ $x =~ TEST_[A-Z]{4}_[0-9]{8}_[A-Z]{3}_[0-9]{8} ]]; then echo "match"; else echo "non match"; fi

两者都将按预期匹配。

Try it online!

【讨论】:

  • 注意全局匹配(===)必须匹配整个字符串;默认情况下,正则表达式匹配只需要匹配部分字符串。要强制进行全字符串匹配,请添加锚点:^ 在开头,$ 在结尾。
猜你喜欢
  • 2015-03-22
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多