零宽度负向前看断言perl

时间:2015-11-22 06:56:48

标签: regex perl

我有以下文本保存在文件中并尝试执行正则表达式

JobsController

当我尝试运行以下perl命令时,

class JobsController < ApplicationController
  before_action :set_job, only: [:edit, :update]
  def index
    @user = User.find(params[:user_id])
    @jobs = Job.all
    # @jobs = current_user.jobs.all
  end

  def show
    @user = User.find(params[:user_id])
    @job = Job.find(params[:id])
    @job_json = @job.to_json(only: [:location, :title, :id])
  end

  def new
    @jobs = Job.new
  end

  def create
    @user = User.find(params[:user_id])
    @job = current_user.jobs.build(job_params)
    @job.user = current_user

    respond_to do |format|
      if @job.save
        format.html { redirect_to @job, success: 'Job wiki was created!' }
        format.json { render json: @job, status: :created, location: @job }
        format.js
      else
        format.html { render action: 'new' }
        format.json { render json: @job.errors, status: :unprocessable_entity }
        format.js
      end
    end
  end
  ...

打印所有三行(而不是打印line2和line3) 这个匹配的第一行怎么样?如果我使用以下perl语句

,我会得到预期的结果
line1 brown fox
line2 black owl
line3 red dear

由于

1 个答案:

答案 0 :(得分:3)

所有三个字符串都成功匹配,因为前瞻之前的.*贪婪地匹配每个字符并吞噬整个字符串。然后引擎将提前尝试断言字符串中的后续内容不是&#34; foo&#34 ;;回溯到前瞻内部的.*并贪婪地重复,直到它在字符串位置的末尾断言。

将前瞻放在字符串的开头,以断言当前位置和后面的内容不是&#34; fox&#34;。如果前瞻成功,引擎将继续匹配。

perl -ne 'print if /^(?!.*fox).*/' text.txt

上面将展望是否没有任何角色(除了换行符)或&#34; fox&#34;。如果成功,则匹配任何字符(除了换行符),换句话说,匹配整个字符串。