如何在Bash中使用正则表达式匹配空格?

26 regex bash

我希望下面的代码能回应"是",但事实并非如此.由于某种原因,它与单引号不匹配.为什么?

str="{templateUrl: '}"
regexp="templateUrl:[\s]*'"

if [[ $str =~ $regexp ]]; then
  echo "yes"
else
  echo "no"
fi
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 55

更换:

regexp="templateUrl:[\s]*'"
Run Code Online (Sandbox Code Playgroud)

附:

regexp="templateUrl:[[:space:]]*'"
Run Code Online (Sandbox Code Playgroud)

根据man bash,=~运营商支持"扩展正则表达式",如中所定义man 3 regex. man 3 regex说它支持POSIX标准并引用读者man 7 regex.POSIX标准支持[:space:]作为空白的字符类.

GNU bash手册记录了支持的字符类,如下所示:

在'['和']'中,可以使用语法[:class:] 来指定字符类,其中class是POSIX标准中定义的以下类之一:

alnum alpha ascii空白cntrl数字图表下部打印
punct空间上部字xdigit

\s我在GNU bash文档中找到的唯一提及是在提示中使用不相关的,例如PS1,不在正则表达式中.

的含义 *

[[:space:]]恰好匹配一个空格字符. [[:space:]]*将匹配零个或多个空格字符.

space和之间的区别blank

POSIX正则表达式提供两类空格:[[:space:]][[:blank:]]:

  • [[:blank:]]表示空格和制表符.这使它类似于:[ \t].

  • [[:space:]]除了空格和制表符,还包括换行符,换行符,换页符和垂直制表符.这使它类似于:[ \t\n\r\f\v].

使用字符类的一个关键优势是它们对于unicode字体是安全的.

  • 请注意,`[:space:]`表示所有空格,包括回车符和换行符; 而`[:blank:]`表示"水平"空格(空格和制表符) - http://www.regular-expressions.info/posixbrackets.html (4认同)