【问题标题】:Matching a string with a known prefix and suffix with regex using Grep使用 Grep 将具有已知前缀和后缀的字符串与正则表达式匹配
【发布时间】:2015-07-20 22:11:19
【问题描述】:

我正在尝试使用已知前缀和最常见的后缀匹配所有字符串。

前缀可以是任意 3 个大写字符。

后缀将是一个大写的C,后面是零或一个数字。 前任。 CCx 其中x 是任意数字

中间的子串长度未知,只有大写字母。

示例:

GORABJKAC3 [match]
GORCCCCC [match]
GORBBBBCCC [match
GORBBBBCA [no match]
BORBBBBCA2 [no match]

我尝试了grep ^GOR[:upper:]*C[:digit:]* 之类的方法,但不起作用。

我认为[:upper:] 可能只使用所有大写字母,包括我想匹配的后缀C

如何使用 grep 将我想要的字符串与正则表达式匹配?

【问题讨论】:

  • 正确使用POSIX字符类的方法是[[:upper:]]
  • nhatdh 是对的,regex(7) 手册页说:“在括号表达式中,用“[:”和“:]”括起来的字符类的名称...”——你想要^GOR[[:upper:]]*C[[:digit:]]*\>,其中\>是一个“词尾”标记以避免匹配“GORBBBCA”——或者跳过\>并使用grep -o
  • 如果在字尾标记之后的字符串中可能还有其他字符,该标记会阻止它尝试匹配更多字符吗?
  • 我会在示例中添加更多内容以澄清,但显然格式化为代码的代码未格式化为代码,并且不允许发布。

标签: regex grep


【解决方案1】:

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

\b[A-Z]{3}.*?C[0-9]?\b

RegEx Demo

或使用锚点(如果这些字符串在不同的行上):

^[A-Z]{3}.*?C[0-9]?$

【讨论】:

    【解决方案2】:

    使用[A-Z] 代替[:upper:][0-9] 代替[:digit:]

    另外,* 表示 0 或更多,+ 表示 1 或更多,? 表示 0 或 1。我想你想使用 +?

    +? 是特殊的 Perl 正则表达式字符,因此请将 -P 标志添加到您的 grep 命令中。

    所以最后的正则表达式:grep -P ^GOR[A-Z]+C[0-9]?

    【讨论】:

    • 我尝试了您的最终正则表达式,但没有成功。我什至在一个只包含示例字符串行的文件上尝试了grep ^GOR[A-Z]+C[0-9]?,但我什么也没得到。
    • 哦,你需要使用 Perl 正则表达式,它应该是 [A-Z],我会编辑
    • 我认为我的正则表达式版本没有 -P。我检查了手册页,发现 -P 和 -o 都不见了。
    • 好吧,[A-Z]+ 可以替换为[A-Z][A-Z]*。和[0-9]? 可以替换为[0-9]{0,1}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多