模式“^-0+([0-9]+)”与“^-0+([1-9]+)”相同吗?

模式“^-0+([0-9]+)”与“^-0+([1-9]+)”相同吗?

杰夫写于以负数命名的文件名的参数扩展错误

此时我最好的方向是做一些事情,比如[[ $b =~ ^-0+([0-9]+)$ ]] && b=-${BASH_REMATCH[1]}从可能为负数的数字中去除前导零

0我想知道模式中的起始数字是否是必要的。换句话说,模式^-0+([0-9]+)与 相同吗^-0+([1-9]+)?谢谢。

答案1

不,^-0+([1-9]+)与 之类的数字不匹配-320

编辑:重读模式,实际上有两个原因-320不匹配,

  1. 0the 之后没有's -(并且+说必须有) - 但这不是两种模式之间的区别(并且可能是它们的缺陷)

  2. 0第一个非零数字后面有一个- 这就是模式之间的区别。

答案2

是否在相同字符串上^-0+([0-9]+)匹配将取决于区域设置。在 C/POSIX 语言环境中,它们将匹配相同的字符串(包括和),但 捕获的内容可能不同(例如,前者捕获on而后者捕获)。^-0+([1-9]+)$-01foo-00230bar(...)230-00230bar23

使用$,如 @Henrik 所示,它们不会在相同的字符串上匹配。^-0+([1-9]+)$不会匹配-00230.

在其他地区,您的里程可能会有所不同。例如,在en_GB.UTF-8Solaris 10 系统上的区域设置中,^-0+([0-9]+)将匹配 on,-0⓿⓿12因为它是在中间排序的字符0,因此与或1匹配,但不会与 ⓿匹配,也不会匹配 ⓿。[0-1][0-9]^-0+([1-9]+)0+[1-9]

为了完整起见,要使用标准sh语法来执行此操作而不必依赖bash/ksh93扩展,您可以执行以下操作:

case ${b#-0} in
  ("$b" | "" | *[![:digit:]]*) echo >&2 no match;;
  (*) b=${b#"${b%%[!0-]*}"};;
esac

这里的好处是[[:digit:]](相对于[0-9])仅匹配0123456789

相关内容