0

我是写正则表达式的新手

我有一个像TST0101201304-123.txt这样的文件名,我的目标是获取'-''.txt'之间的数字

所以我写了这个公式-([0-9]*)\.txt,这会得到我想要的数字,但此外,它正在检索高音“-”和字符串的最后一部分也是“.txt”,所以上面示例中的结果是“-123” 。文本'

所以我的问题是:

正则表达式中是否有一种方法可以仅获取匹配字符串的一部分,例如匹配的子匹配项,而无需在我的 unix 的 shell 脚本代码中对其进行修剪?

我找到了这个答案,但得到了相同的结果: Regexp: Trim parts of a string and return what ever is left

提示:为了测试我的正则表达式使用了这个网站

4

3 回答 3

2

您可以使用lookbehind和lookahead

(?<=-)[0-9]*(?=[.]txt)

不知道unix能不能用

于 2013-07-08T05:31:18.230 回答
1

不同的正则表达式引擎是不同的。由于您使用的是expr match,因此您需要进行两项更改:

  • expr match期望匹配整个字符串的正则表达式;所以,你需要.*在你的开头添加,以覆盖连字符之前的所有内容。
  • expr match使用POSIX 基本正则表达式 (BRE),它使用\(and\)进行分组(和捕获),而不仅仅是(and )

但是,方便的是,当你给出expr match一个包含捕获组的正则表达式时,它的输出就是那个捕获组的内容;你不需要做任何其他特别的事情。所以:

$ expr match TST0101201304-123.txt '.*-\([0-9]*\)\.txt'
123
于 2013-07-09T14:55:53.373 回答
1

sed 是你的朋友。

echo filename | sed -e 's/-\([0-9]*\)/\1'

应该得到你想要的。

于 2013-07-08T05:31:48.063 回答