在括号中匹配文本

时间:2014-10-06 15:04:03

标签: regex bash

一个相当简单的目标 - 我想:在括号中匹配包含两个逗号分隔部分的文本,例如: [第一秒] 这就是整行,我使用了bash 4.1。

我尝试了这样的模式匹配,然后尝试使用BASH_REMATCH:

[[ "$file_contents" =~ ^[\ []\(.*\),\(.*\)\ []\ ]$ ]] && echo YES || echo NO

我尝试了几次小修改,但完全没有匹配或BASH_REMATCH的内容错误。

上面的正则表达式有什么不对?

2 个答案:

答案 0 :(得分:1)

这适用于来自CentOS 5的bash 3.2.25(1)但是来自CentOS 6的bash 4.1.2(1)失败:

$ file_contents="[word1 word2,word3 word4]"
$ [[ $file_contents =~ ^\\[([^,]+),([^]]+)\\] ]]; echo $?
0
$ declare -p BASH_REMATCH
declare -ar BASH_REMATCH='([0]="[word1 word2,word3 word4]" [1]="word1 word2" [2]="word3 word4")'
  • 字符串开头:^
  • 文字方括号:\\[
  • 捕获开始:(
  • 除逗号以外的任何类别中的一个或多个:[^,]+
  • 捕获结束:)
  • 文字逗号:,
  • 捕获开始:(
  • 除了方括号之外的任何类别中的一个或多个:[^]]+
  • 捕获结束:)
  • 文字近方括号:\\]

这可以在CentOS 6的bash 4.1.2(1)中使用,但在CentOS 5的bash 3.2.25(1)中失败:

[[ $file_contents =~ ^\[([^,]+),([^]]+)\] ]]; echo $?
  • 字符串开头:^
  • 文字方括号:\[
  • 捕获开始:(
  • 除逗号以外的任何类别中的一个或多个:[^,]+
  • 捕获结束:)
  • 文字逗号:,
  • 捕获开始:(
  • 除了方括号之外的任何类别中的一个或多个:[^]]+
  • 捕获结束:)
  • 文字近方括号:\]

答案 1 :(得分:0)

你可以使用这样的正则表达式:

\[\w+,\w+\]

<强> Working demo

enter image description here