【问题标题】:How to match beginning of string "like" it were in character class?如何匹配字符类中字符串“like”的开头?
【发布时间】:2020-01-04 05:57:12
【问题描述】:

我在文件中有一个字符串说:

abc

def abc

我想匹配abc,使其可以出现在行首或空白之后。

我可以通过匹配多个模式来做到这一点,用| 分隔,比如:

/^abc|[[:blank:]]+abc/

但是有什么方法可以包含^,即字符串的开头类似于字符类。

字符类开头的

^ 表示 否定,其他位置表示仅匹配 carrot('^') 字符

另外,在我原来的情况下,字符串不仅仅是abc,而是一个与复杂正则表达式匹配的字符串,所以我希望它尽可能干净。我在awk 脚本中匹配这个正则表达式。虽然我仍然包含bash 标签,因为system() 函数仍然可以在其中使用。就我而言,速度对我来说并不重要,但清晰度很重要。

【问题讨论】:

  • 在 POSIX 正则表达式术语中,character class 是一个预定义的字符串,表示一组字符,例如[:space:][:alnum:]。您可以使用 括号表达式 中的那些来匹配正则表达式中的字符集,例如[[:space:]][[:alnum:]][[:space:][:alnum:]]。所以你真正要问的不是is there some way to include ^ i.e. beginning of the line in character class.,因为不可能将字符添加到字符类中,你要问的是is there some way to include ^ i.e. beginning of the line in a bracket expression.
  • 答案是“否”,因为^ 在这种情况下不是一个字符,它是一个表示“字符串开头”的正则表达式构造(不是“行首” - 它只是顺便说一句,当您正在处理的字符串是一行时,表示“行首”),因此您不能将其包含在括号表达式中,该表达式是一组字符加上否定 ^ 和范围 -说字符。
  • @EdMorton 是的,我最近发现了这一点。也对我的问题进行了更正。谢谢

标签: regex bash awk


【解决方案1】:

使用捕获组:

(^|[[:blank:]]+)abc

它将匹配字符串的开头或一系列空格。如果您在匹配中不需要 abc 之前的所有空格,而需要最后一个空格,则可以删除 +

【讨论】:

    【解决方案2】:

    应该这样做:

    /(^|[[:blank:]])abc/
    

    ^ start 或[[:blank:]] 开头,然后是abc

    【讨论】:

      【解决方案3】:

      ^ 的开头或行 不是 一个字符,它是一个锚,因此将它放在 character 类以及 \A 中是没有意义的, $\z\b

      在您的情况下,您只需要测试 wordboundary,不需要使用会减慢正则表达式的捕获组:

      \<abc
      

      这匹配abc,前面有行首或非单词字符。

      Demo

      【讨论】:

      • 感谢您提供更多信息。虽然这对我不起作用。如问题中所述,我在awk 中使用它。 awk '/\babc/' file 甚至最新版本的 gawk 不会产生任何东西。赞成,因为它在其他方面是正确的。
      • @Mihir:抱歉,wordboundary (gawk) 是 \&lt;,请看我的编辑
      • 在标点符号等之后匹配abc,不过,例如whatever.abc.
      • @EdMorton:没错,这就是我所说的“当前面有一个非单词字符时”。我的回答更多地是关于为什么我们不能将 carret 放在角色类中。
      猜你喜欢
      • 1970-01-01
      • 2012-08-26
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多