AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 525229
Accepted
conanDrum
conanDrum
Asked: 2019-06-16 23:16:26 +0800 CST2019-06-16 23:16:26 +0800 CST 2019-06-16 23:16:26 +0800 CST

perl 正则表达式 - 如何匹配不以 (\s*//\s*) 开头的 foobar

  • 772

基本上我想在未注释的行上找到 foobar,例如:

// foobar      # do not match me
 foobar        # match me
 otherfoobar   # do not match me

为了匹配我使用的注释行:^(\s*//\s*)\bfoobar\b.*$

如何匹配未注释的行?

笔记:

为避免不必要的努力,请将答案限制为“^...$”。这必须纯粹在发送到 perl 进行匹配的字符串中完成。

foob​​ar 也必须像 \bfoobar\b 一样整体匹配

最后, \bfoobar\b 除了空格或注释签名之外,不应以任何内容开头。

regular-expression scripting
  • 3 3 个回答
  • 1510 Views

3 个回答

  • Voted
  1. Stéphane Chazelas
    2019-06-17T13:29:19+08:002019-06-17T13:29:19+08:00

    foobar在 a 右侧未找到的A//可以表示为:

    ^(?:(?!//).)*\bfoobar\b
    

    这是一个由 0 个或多个 ( *) 字符 ( .) 组成的序列,每个字符都不在//序列 ( (?!//)) 的开头,后跟一个foobar由单词边界分隔的字符。

    • 2
  2. Best Answer
    conanDrum
    2019-06-17T07:55:15+08:002019-06-17T07:55:15+08:00

    我认为否定的问题不应该过于复杂。

    例如说我希望拒绝这些行:

    "^(\s*//\s*).*(\bfoobar\b).*$"
    

    IE。'//'在开头的空白处的任何地方都有注释签名,然后是包含'foobar'整个单词的任何内容(为清楚起见包括括号)。

    为了否定这一点,我们这样做:

    "^(?!\s*//\s*).*(\bfoobar\b).*$"
    

    我们只是替换(\s*//\s*)为(?!\s*//\s*)

    这忽略了任何在空格中任何地方都有注释签名的东西,'//'开头是我们的模式。

    结果:

      // foobar will not be matched
      // whatever foobar will not be matched
      foobar will be matched
      whatever foobar will be matched
      whateverfoobar will not be matched
    

    注意:.*您可以通过更改之前的设置来进一步微调(\bfoobar...。

    例如我可以"^(?!\s*//\s*)\s*(\bfoobar\b).*$"

      foobar will be matched
      whatever foobar will **NOT** be matched
    

    警告: 如果您曾经'foobar'用一些任意字符串替换'${foobar}'并尝试上述方法,它将失败。原因是您的正常 'foobar' 仅由单词字符组成,现在(\bfoobar\b)不会匹配它。在这种情况下,\b必须删除。

    • 1
  3. ilkkachu
    2019-06-17T08:56:49+08:002019-06-17T08:56:49+08:00

    如果您使用的是 Perl(语言)而不是使用 Perl 兼容正则表达式的工具,则没有理由将自己限制在一个正则表达式中。

    像这样的东西只匹配未注释的行:

    $ perl -ne 'print if not m,^\s*//, and /\bfoobar\b/' < file.txt 
     foobar        # match me
    

    即使使用其他实用程序或非 Perl 正则表达式,使用多个正则表达式可能是最简单的:

    $ < file.txt grep -ve '//' | grep '\<foobar\>'
     foobar        # match me
    

    相反,如果您仅限于单个 Perl 正则表达式,那么这应该可以:

    grep -P '^\s*+(?!//).*\bfoobar\b.*$' file.txt
    

    这\s*+是一个“占有式”表达式,它匹配所有前导空格,并且不会放开它们。然后(?!//)检查前导空格之后的内容是否不是注释标记,最后我们foobar在该行的任何位置查找分词符。

    (如果空格在没有所有格限定符的情况下匹配,则正则表达式引擎可能会从前导空格中退出,并检查错误位置的注释标记,从而导致匹配的注释行。)

    测试数据:

    $ cat file.txt
     // foobar        # do not match
     foobar           # 1st match
    otherfoobar       # do not match
    something foobar  # 2nd and final match
    $ grep -P '^\s*+(?!//).*\bfoobar\b.*$' file.txt
     foobar           # 1st match
    something foobar  # 2nd and final match
    
    • 1

相关问题

  • 在我的 Nginx 服务器环境中复制网站 (Wordpress) 的快速方法?

  • 启动应用程序的问题:命令行与 gui

  • 用于在日志文件中查找字符串的 Shell 脚本

  • 更少:使用 AND 的多个过滤条件

  • 根据其中的值批量重命名(附加)CSV 文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve