【问题标题】:Regex - match up to first literal正则表达式 - 匹配第一个文字
【发布时间】:2014-09-14 01:22:07
【问题描述】:

我有一些代码行,我试图从中删除一些前导文本,如下所示:

Line 1: myApp.name;
Line 2: myApp.version
Line 3: myApp.defaults, myApp.numbers;

我正在尝试并试图找到一个正则表达式,它将删除(但不包括)myApp 的任何内容。

我尝试了各种正则表达式,但在第 3 行时它们似乎都失败了(因为 myApp 出现了两次)。

到目前为止我最接近的是:

.*?myApp

非常简单 - 但它匹配第 3 行中 myApp 出现的两个实例 - 而我希望它只匹配第一个。

有几百行 - 否则我现在已经手动删除它们了。

有人可以帮助我吗?谢谢。

【问题讨论】:

  • 这是在哪里运行的?它有搜索和替换功能吗?
  • ^.*?myApp 可以解决问题。下次,请指定您需要正则表达式的平台/语言 - 它们确实存在差异。
  • 我将在 Notepad++ 中使用它来进行大型替换。
  • 谢谢大家!会做的,这一次逃过了我,但我下次一定会做。

标签: regex


【解决方案1】:

您需要添加一个锚点^,它与一条线的起点相匹配,

^.*?(myApp)

DEMO

使用上述正则表达式并将匹配的字符替换为$1\1。这样你就可以在替换后的最终结果中得到字符串myApp

模式说明:

  • ^ 一行的开头。
  • .*?(myApp) 与第一个 myApp 的最短匹配。字符串myApp 被捕获并存储到一个组中。(group 1
  • 所有匹配的字符都替换为组 1 中的字符。

【讨论】:

  • 谢谢!你能解释一下为什么克拉会如此重要吗?我需要提高我的正则表达式技能。
  • 我明白它表示一行的开始,但不明白它有什么帮助。
【解决方案2】:

如果您添加 ^ 以确保您只匹配行的开头,则您的正则表达式在 Perl 中有效:

cat /tmp/test.txt  | perl -pe 's/^.*?myApp/myApp/g'
myApp.name;
myApp.version
myApp.defaults, myApp.numbers;

如果您想变得花哨,可以将“myApp”放入一个组中,该组不会使用(?=) 语法作为表达式的一部分被捕获。这样就不用重新装回去了。

cat /tmp/test.txt  | perl -pe 's/^.*?(?=myApp)//g'
myApp.name;
myApp.version
myApp.defaults, myApp.numbers;

【讨论】:

  • 谢谢 - 为什么克拉会如此重要?这就是我所缺少的一切,我正在努力寻找它的帮助。
  • 表示从字符串的开头开始匹配。没有它,第三行中有两个匹配项:Line 3: myApp.defaults, myApp,这两个匹配项都会被删除。他们中只有一个开始排队,所以插入符号会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2019-12-13
  • 2017-02-09
  • 2014-08-12
相关资源
最近更新 更多