Emacs如何删除所有文本,除了" some_text"?

时间:2017-05-25 15:33:12

标签: replace emacs

Windows 10(64位),Emacs 25.1。

假设我有文字:

    MyActivity.java:124:       RestClient().getAuth("api/method1" + Integer.toString(id) + ".json")
MyActivity2.java:224    RestClient().getAuth("api/method2" + Integer.toString(id) + ".json")
MyActivity2.java:224:      RestClient().getAuth("api/method2" + Integer.toString(id) + ".json")
MyFragment.java:684:    RestClient().getAuth("api/method2" + Integer.toString(id) + ".json")
MyActivity2.java:224:        RestClient().getAuth("api/method1" + Float.toString(id) + ".xml")
Fragment.java:234:    RestClient().getAuth("api/method1" + Integer.toString(id) + ".json")
MyActivity2.java:224:        RestClient().getAuth("api/method4" + Float.toString(id) + ".xml")

我如何删除除#34; api / xxx"之外的所有文字。结果必须是:

"api/method1" "api/method2" "api/method2" "api/method2" "api/method1" "api/method1" "api/method4"

我想使用Emacs的内置功能(无需编写自定义elisp脚本或Emacs宏)。

2 个答案:

答案 0 :(得分:4)

选择要修改的行并运行 M-x replace-regexp。使用.*\("api/.+?"\).*替换正则表达式,替换使用\1

这个正则表达式说:

  • .* - 匹配任意数量的任何字符
  • \(...\) - 在parens之间保存位
  • "api/.+?" - 文字"api/后跟任何内容,包括下一个"
  • .* - 后跟任意数量的任何字符

并将其替换为\1,这是上面\(\)的第一个(也是唯一一组)中的任何文字。

输出是预期的:

"api/method1"
"api/method2"
"api/method2"
"api/method2"
"api/method1"
"api/method1"
"api/method4"

答案 1 :(得分:0)

如果您对在单独的缓冲区中输出结果感到满意,可以使用occur,如下所示:

C-u M-s o "api/.+?" RET