【问题标题】:Find / Replace functionality that allows for boundary replacements instead of expressions允许边界替换而不是表达式的查找/替换功能
【发布时间】:2013-07-30 19:27:53
【问题描述】:

为令人困惑的标题提前道歉。我的问题如下,我在大约 600 个文件中有以下文本:

$_REQUEST['FOO']

我想用以下内容替换它:

$this->input->post('FOO')

为了澄清,我匹配以下内容:

$_REQUEST any number of A-Za-z\d followed by a ]

并将其替换为:

$this->input->post( the alphanumeric word from above followed by a )

或者一般来说:

Anchor token  TEXT TO KEEP  end anchor token

这与标准查找/替换不同,因为我想将文本保留在两个单词边界内。

此功能是否存在于任何文本编辑器(Eclipse、np++ 等)中。还是我需要编写某种程序来解析这 600 个文件来进行替换?

【问题讨论】:

    标签: regex text language-agnostic replace


    【解决方案1】:
    s/\$__REQUEST\[(.*?)]/$this->input->post(\1)/
    

    .*? 将匹配从 [第一个 ] 的所有内容,而不是最后一个,尽管在这种情况下它不太重要。

    顺便说一句,PHP 超全局是$_REQUEST 而不是$__REQUEST

    【讨论】:

    • 我胖手指了,会改原来的问题。那么上面的那一行会根据需要进行替换吗?
    • 使用[^\]]++ 可能比使用.*? 更好。
    • @BoristheSpider - 我不同意。一方面,您的方法将捕获撇号。其次,非贪婪应该让它工作得很好,只要括号是平衡的,我想他们是平衡的。
    • @Woot4Moo 我想是的,把$__REQUEST改成$_REQUEST
    • @acheong87 Methinks (.*?) 也会捕获这两个撇号,但无论如何都需要它们。所有格量词对于不匹配的文本要快得多,并且当我想象整个 PHP 文件正在被解析时,这是需要考虑的事情。
    【解决方案2】:

    您可以在 Notepad++ 中使用正则表达式执行此操作。替换

    \$_REQUEST\['([^']*)'\]
    

    $this->input->post('$1')
    

    如果你也有双引号,你可以使用更复杂的表达式来处理这两种情况,尽管我不确定 Notepad++ 是否支持反向引用;替换

    \$_REQUEST\[(['"])(.*?)\1\]
    

    $this->input->post($1$2$1)
    

    请注意,我已恢复使用 @ExplosionPills 建议的 (.*?) 此处 — 实际上它可能会更好。

    【讨论】:

    • 第一个表达式不需要[^'] 模式上的量词吗?
    • 失败。输出变为: $this->input->post'foo' it doesn't havce ('foo') [missing the parens]
    • 我知道了,您希望在() 后面都有一个\`
    • @Woot4Moo - 嗯。通常在正则表达式中,您不必在替换表达式中转义括号。这可能是 Notepad++ 的一个怪癖。
    • 啊,是的,我可以看到那是我的测试环境:)。如果你编辑我可以给回积分。
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2017-10-08
    • 2012-06-06
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多