【问题标题】:Find and trim part of what is found using regular expression使用正则表达式查找并修剪找到的部分内容
【发布时间】:2013-07-10 14:26:35
【问题描述】:

我是写正则表达式的新手

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

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

所以我的问题是:

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

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

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

【问题讨论】:

  • 你的号码被括号()捕获。您通常可以通过某种方式在您的 API/工具中检索它,但这取决于您使用的是什么。有时通过$1 访问它。
  • 整个正则表达式匹配-123.txt,但捕获的(记住的)子字符串匹配你想要的部分,123。确保使用捕获而不是整个匹配。
  • 你在用javascript吗?
  • 顺便说一句——go-oleg 询问“你在使用 javascript 吗?”的原因是您使用 JavaScript 正则表达式测试器测试了您的正则表达式。 expr match 支持的正则表达式完全不同,因此自然正则表达式对它们的用处有限。
  • @simsim:.Net、JavaScript 和 Java 正则表达式在基本功能上都非常相似(尽管在更高级的功能上存在许多差异);但是expr match 支持的正则表达式符号即使在非常基本的功能中也有很多差异,例如,使用\(...\) 表示捕获组而不是(...)

标签: regex unix


【解决方案1】:

你可以使用lookbehind和lookahead

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

不知道在unix下能不能用

【讨论】:

    【解决方案2】:

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

    • expr match 需要一个匹配 整个 字符串的正则表达式;因此,您需要在开头添加.*,以覆盖连字符之前的所有内容。
    • expr match 使用POSIX Basic Regular Expressions (BREs),它使用\(\) 进行分组(和捕获),而不仅仅是()

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

    $ expr match TST0101201304-123.txt '.*-\([0-9]*\)\.txt'
    123
    

    【讨论】:

    • 谢谢,成功了,对以后的参考很有用
    【解决方案3】:

    sed 是你的朋友。

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

    应该得到你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多