【问题标题】:Regex doesn't match with the lines in txt file正则表达式与 txt 文件中的行不匹配
【发布时间】:2015-02-10 15:31:52
【问题描述】:

我正在读取文本文件中的行并检查它是否与我创建的正则表达式匹配。

但它总是说你的正则表达式不匹配,但正则表达式工具显示它与我的常规解释匹配。

while read line
do
name=$line
BRANCH_REGEX="\d{10}\-[^_]*\_\d{13}"
if [[ $name =~ $BRANCH_REGEX ]];
then
    echo "BRANCH '$name' matches BRANCH_REGEX '$BRANCH_REGEX'"
else
    echo "BRANCH '$name' DOES NOT MATCH BRANCH_REGEX '$BRANCH_REGEX'"
fi
done < names.txt

names.txt 包括行例如:

9000999484-suchocka_1416578464908
9000989944-schubertk_1416582641605
9001026342-extbeerfelde_1416586904787
9000687045-sturmjo_1416573131629
9001059401-extburghartswieser_1416405627982
9000806302-PDPUPDATE_1357830207068
9000658783-PDPUPDATE_1360445087963

【问题讨论】:

  • 您的正则表达式以 / 开头,但没有一行包含 / 。 . .
  • 我删除了第一个 '/' 但又不匹配了...
  • 酷。所以,现在你只需要弄清楚你的正则表达式的其他问题。 (“我的代码不起作用”不是一个好的 StackOverflow 问题。您当然可以玩弄一下,找出问题所在?)
  • 问题在于 bash 配置,我认为这不是“我的代码不起作用”之类的问题。
  • 我的意思是,你发布了一个比较大的代码块。您无法更精确地缩小问题范围是不可思议的;相反,一定是您选择不这样做,认为您可以将调试外包给 StackOverflow。

标签: regex bash


【解决方案1】:
BRANCH_REGEX="/\d{10}\-[^_]*\_\d{13}"
              ↑

去掉前面的/,你的行都不以它开头。

还要注意_不需要转义,你可以写_而不是\_

【讨论】:

    【解决方案2】:

    将您的正则表达式更改为:

    BRANCH_REGEX="[0-9]{10}-[^_]*_[0-9]{13}"
    

    否则:

    BRANCH_REGEX="[[:digit:]]{10}-[^_]*_[[:digit:]]{13}"
    

    由于 BASH 正则表达式不支持 \d 属性。无需转义连字符。

    【讨论】:

    • 非常感谢,我不知道 :)
    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    相关资源
    最近更新 更多