Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 创建正则表达式以分析生成版本_Regex_Sed - Fatal编程技术网

Regex 创建正则表达式以分析生成版本

Regex 创建正则表达式以分析生成版本,regex,sed,Regex,Sed,我正在从包含以下行的文件中获取构建版本: <Assembly: AssemblyVersion("004.005.0862")> 我在dos中使用sed,并得到了以下输出004.005.0862 echo "<Assembly: AssemblyVersion("004.005.0862")>" | sed "s/[^0-9,.]//g" echo“| sed”s/[^0-9,.]//g” 如何去除构建编号每个部分的前导零?可能…|sed“s/[^0-9]*0*

我正在从包含以下行的文件中获取构建版本:

 <Assembly: AssemblyVersion("004.005.0862")> 
我在dos中使用sed,并得到了以下输出004.005.0862

echo "<Assembly: AssemblyVersion("004.005.0862")>" | sed "s/[^0-9,.]//g"
echo“| sed”s/[^0-9,.]//g”

如何去除构建编号每个部分的前导零?

可能
…|sed“s/[^0-9]*0*([1-9][0-9,.]*)/\1/g“
。我正在使用一个子模式过滤掉您需要的部分,忽略前导零和非数字字符。

可能有很多更聪明的方法,但一种有效的方法(并且相当容易理解)是通过额外的调用来实现:

echo "version(004.005.0862)" | sed "s/[^0-9,.]//g" | sed "s/^0*//g" | sed "s/\.0*/./g"

在单个步骤中执行此操作的正则表达式如下所示:

^.*"0*([0-9]+\.)0*([0-9]+\.)0*([0-9]+).* ^.*"0*([0-9]+\.)0*([0-9]+\.)0*([0-9]+).* 使用sed特定的转义,作为完整表达式,它会变长一点:

s/^.*"0*\([0-9]\+\.\)0*\([0-9]\+\.\)0*\([0-9]\+\).*/\1\2\3/g s/^.*“0*\([0-9]\+\.\)0*\([0-9]\+\.\)0*\([0-9]\+\)./\1\2\3/g
正则表达式分解为

^ # start-of-string .*" # anything, up to a double quote 0*([0-9]+\.) # any number of zeros, then group 1: at least 1 digit and a dot 0*([0-9]+\.) # any number of zeros, then group 2: at least 1 digit and a dot 0*([0-9]+) # any number of zeros, then group 3: at least 1 digit .* # anything up to the end of the string ^#字符串开头 .*“#任何东西,最多一个双引号 0*([0-9]+\)\任意数量的零,然后第1组:至少1个数字和一个点 0*([0-9]+\)\任意数量的零,然后第2组:至少1位数字和一个点 0*([0-9]+)#任意数量的零,然后第3组:至少1位 .*
只是因为我好奇,我想看看聪明的版本,但是你的方式很好用!争论可以是任何一种方式,但是对于这样的事情,我更喜欢简单的(尽管技术上可能不那么优雅)解决方案。当下一个人出现并且必须弄清楚它的含义时,这可能会更好。非常好!sed表达式末尾的\1\2\3做什么?@fasttimes:它们输出捕获组(在
\(
\)之间的匹配情况
)。您的
echo
应具有外部单引号,而不是双引号,以便内部引号是带引号字符串的一部分。 ^ # start-of-string .*" # anything, up to a double quote 0*([0-9]+\.) # any number of zeros, then group 1: at least 1 digit and a dot 0*([0-9]+\.) # any number of zeros, then group 2: at least 1 digit and a dot 0*([0-9]+) # any number of zeros, then group 3: at least 1 digit .* # anything up to the end of the string