Regex 使用bat查找字符串位置最后一位数字的最佳选项

Regex 使用bat查找字符串位置最后一位数字的最佳选项,regex,windows,batch-file,command-line,cmd,Regex,Windows,Batch File,Command Line,Cmd,在某些情况下,字符串可以采用不同的值: foto_20180601_1.jpg foto_20180601_10.jpg foto_20180601_100.jpg foto_20180601_1000.jpg 如果我想得到这些字符串中的最后一位(1、10、100、1000),我可以: set var=%string:~14% (returns 1.jpg | 10.jpg | 100.jpg | 1000.jpg) set mystring=%var:.jpg=% (removes '.jpg

在某些情况下,字符串可以采用不同的值:

foto_20180601_1.jpg
foto_20180601_10.jpg
foto_20180601_100.jpg
foto_20180601_1000.jpg

如果我想得到这些字符串中的最后一位(
1、10、100、1000
),我可以:

set var=%string:~14% (returns 1.jpg | 10.jpg | 100.jpg | 1000.jpg)
set mystring=%var:.jpg=% (removes '.jpg' and returns the number)
所以我想知道是否有一些改进的方法,我可以使用
findstr
使用
regex
来获得这些数字

我尝试过这样的东西,但没有得到:

set string=foto_20180601_100.jpg
for %%f in ("%string:\=" "%") do for /f %%n in ('echo %%f^|findstr /b /e /r "*[0-9]*.jpg"') do (
    echo %%~n
)

编辑示例的新变体

@Echo off
set string=foto_20180601_100.jpg
for %%f in (%string:_= %) do for /f "delims=." %%n in (
    'echo %%f^|findstr /i "^[0-9]*.jpg$" ') do echo %%~n

修改上一个示例(并使用的提示)

样本输出:

Last=100
PowerShell示例

> ls foto*
    Verzeichnis: A:\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-06-02     00:26              2 foto_20180601_1.jpg
-a----       2018-06-02     00:26              2 foto_20180601_10.jpg
-a----       2018-06-02     00:26              2 foto_20180601_100.jpg
-a----       2018-06-02     00:26              2 foto_20180601_1000.jpg

PoSh 00:43:49 A:\______________________________________________________
> ls "foto_*_*.jpg"|? Basename -match 'foto_\d{8}_(\d+)'|%{$matches[1]}
1
10
100
1000

编辑示例的新变体

@Echo off
set string=foto_20180601_100.jpg
for %%f in (%string:_= %) do for /f "delims=." %%n in (
    'echo %%f^|findstr /i "^[0-9]*.jpg$" ') do echo %%~n

修改上一个示例(并使用的提示)

样本输出:

Last=100
PowerShell示例

> ls foto*
    Verzeichnis: A:\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-06-02     00:26              2 foto_20180601_1.jpg
-a----       2018-06-02     00:26              2 foto_20180601_10.jpg
-a----       2018-06-02     00:26              2 foto_20180601_100.jpg
-a----       2018-06-02     00:26              2 foto_20180601_1000.jpg

PoSh 00:43:49 A:\______________________________________________________
> ls "foto_*_*.jpg"|? Basename -match 'foto_\d{8}_(\d+)'|%{$matches[1]}
1
10
100
1000
那么这个呢:

set“STRING=foto_20180601_100.jpg”
对于(“%STRING:\%”)中的%%I,执行echo%%~nI
这将用
\
替换每个
,使文件名显示为
for
循环的相对路径;
for
变量的
~n
修饰符提取最后一个元素的纯名称,这是感兴趣的部分

要检查提取的部分是否为纯数字部分,可以执行以下操作:

set“STRING=foto_20180601_100.jpg”
对于%%I in(“%STRING:\%”)执行以下操作(
(对于/F“delims=0123456789 eol=0”%%J in(“%%~nI”)do rem/)&&(
echo%%~nI不是数字
) || (
echo%%~nI是纯数字
)
)
这个怎么办:

set“STRING=foto_20180601_100.jpg”
对于(“%STRING:\%”)中的%%I,执行echo%%~nI
这将用
\
替换每个
,使文件名显示为
for
循环的相对路径;
for
变量的
~n
修饰符提取最后一个元素的纯名称,这是感兴趣的部分

要检查提取的部分是否为纯数字部分,可以执行以下操作:

set“STRING=foto_20180601_100.jpg”
对于%%I in(“%STRING:\%”)执行以下操作(
(对于/F“delims=0123456789 eol=0”%%J in(“%%~nI”)do rem/)&&(
echo%%~nI不是数字
) || (
echo%%~nI是纯数字
)
)


如果文件名的结构与示例中的一样规则,请在下划线处使用
进行/f
拆分,以获取最后一(3)个标记。否则,顾名思义,findstr的(有限的)RegEx功能只对查找字符串有用。是的,我知道,但我正在尝试修改这里找到的代码=>,但无法获得它。这就是我寻求帮助的原因。
grep
适用于Windows,PowerShell?非主题PowerShell:
ls“foto_*..jpg”|?Basename-match'foto\ud{8}{(\d+){$matches[1]}
将只列出尾随数字为什么要替换字符串中的反斜杠?您的字符串中没有反斜杠!如果文件名的结构如示例中所示是规则的,请在下划线处使用
for/f
拆分,以获取最后一个(第3个)标记。否则,顾名思义,findstr的(有限的)RegEx功能只对查找字符串有用。是的,我知道,但我正在尝试修改这里找到的代码=>,但无法获得它。这就是我寻求帮助的原因。
grep
适用于Windows,PowerShell?非主题PowerShell:
ls“foto_*..jpg”|?Basename-match'foto\ud{8}{(\d+){$matches[1]}
将只列出尾随数字为什么要替换字符串中的反斜杠?您的字符串中没有反斜杠!是的,当然;这是一个解决方案,而且有效。使用我的
regex
方法的一些想法?如前所述,findstr只能过滤包含regex的行。没有高级替换功能/捕获组等-这是一条死胡同。请使用j-/vbscript/PowerShell进行此操作。感谢我的朋友为您提供的帮助,但请您在此处查看=>。这里有一个我需要的接近的例子。这个方法在路径中的某个地方寻找一个数字,并使用findstr只过滤数字。它也会赶上一个约会。我将在我的答案中添加一个有效版本。如果您使用
设置“Last=%%~nf”
以后就不必截断
.jpg
扩展名。。。不管怎样,+1!是的,当然;这是一个解决方案,而且有效。使用我的
regex
方法的一些想法?如前所述,findstr只能过滤包含regex的行。没有高级替换功能/捕获组等-这是一条死胡同。请使用j-/vbscript/PowerShell进行此操作。感谢我的朋友为您提供的帮助,但请您在此处查看=>。这里有一个我需要的接近的例子。这个方法在路径中的某个地方寻找一个数字,并使用findstr只过滤数字。它也会赶上一个约会。我将在我的答案中添加一个有效版本。如果您使用
设置“Last=%%~nf”
以后就不必截断
.jpg
扩展名。。。不管怎样,+1!