【问题标题】:Bash regexp .* matches too far [duplicate]Bash regex .* 匹配太远[重复]
【发布时间】:2015-12-10 11:32:34
【问题描述】:

我有一个文件 input.txt,内容如下:

foo
[assembly: AssemblyVersion("1.2.3")]
bar")]
quux

为了匹配输入中的1.2.3,使用以下脚本:

#!/bin/bash
regex='\[assembly: AssemblyVersion\("(.*)"\)\]'
fileContent=$(cat input.txt)
[[ "$fileContent" =~ $regex ]]
echo "${BASH_REMATCH[1]}"

我希望输出是 1.2.3 但它是:

1.2.3")]
bar

为什么会这样?如何解决?

https://regex101.com 的正则表达式测试器按预期工作。

【问题讨论】:

  • 贪婪。试试'\[assembly: AssemblyVersion\("([^()]*)"\)\]'
  • @stribizhev 哇,不错,确实有效。非常感谢!

标签: regex bash


【解决方案1】:

.* 称为贪心点匹配子模式,它匹配")、任何字符including a newline

因此,限制贪婪的最佳技巧是使用否定字符类[^"],它将匹配除" 之外的任何字符(如果引用的字符串中不能有引号):

'\[assembly: AssemblyVersion\("([^"]*)"\)\]'
                                ^^^^^ 

Demo

或者 - 如果引用的字符串中不应该有 ()

'\[assembly: AssemblyVersion\("([^()]*)"\)\]'
                                ^^^^^  

Demo

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2020-05-18
  • 2016-10-08
相关资源
最近更新 更多