【问题标题】:Best option to find last digits in a position of string with bat用 bat 查找字符串位置的最后一位数字的最佳选择
【发布时间】:2023-03-22 07:04:01
【问题描述】:

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

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)

所以我想知道是否有一些改进的方法可以使用findstrregex 来获取这些数字。

我试过这样的东西,但无法得到它:

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
)

【问题讨论】:

  • 如果文件名的结构是规则的,如您的示例,请在下划线处使用for /f 拆分,获取最后一个(第三个)标记。否则,顾名思义,findstr 的(有限)RegEx 功能仅对查找字符串有用。
  • 是的,我知道,但我正在尝试调整此处找到的代码 => https://stackoverflow.com/a/19659283/2954267,但无法获得。这就是我寻求帮助的原因。
  • grep 适用于 Windows、PowerShell?
  • 离题 PowerShell:ls "foto_*_*.jpg"|? Basename -match 'foto_\d{8}_(\d+)'|%{$matches[1]} 将仅列出尾随数字
  • 为什么要替换字符串中的反斜杠?您的字符串中没有反斜杠!

标签: regex windows batch-file command-line cmd


【解决方案1】:

编辑示例的新变体

@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

100

修改您的最后一个示例(并使用aschipfl 的提示)

@Echo off
set string=foto_20180601_100.jpg
for %%f in (%string:_= %) do Set "Last=%%~nf"
Set Last

样本输出:

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

【讨论】:

  • 是的,当然;这是一个解决方案并且有效。我的regex 方法的一些想法?
  • 如前所述 findstr 只能过滤包含 RegEx 的行。没有高级替换功能/捕获组等 - 这是一个死胡同。为此使用 j-/vbscript/PowerShell。
  • 感谢我的朋友的帮助,但请您看看这里 => https://stackoverflow.com/a/19659283/2954267。有一个我需要的例子。
  • 那么该方法在路径中的某处查找数字并使用 findstr 仅过滤数字。它也会赶上约会。我会在我的答案中添加一个工作版本。
  • 如果您使用了Set "Last=%%~nf",您以后就不必截断.jpg 扩展...无论如何,+1!
【解决方案2】:

这个呢:

set "STRING=foto_20180601_100.jpg"
for %%I in ("%STRING:_=\%") do echo %%~nI

这会将每个_ 替换为\,这使得文件名显示为for 循环的相对路径; for 变量的 ~n 修饰符然后提取最后一个元素的纯名称,这是感兴趣的部分。

要检查提取的部分是否纯数字,您可以这样做:

set "STRING=foto_20180601_100.jpg"
for %%I in ("%STRING:_=\%") do (
    (for /F "delims=0123456789 eol=0" %%J in ("%%~nI") do rem/) && (
        echo %%~nI is NOT numeric
    ) || (
        echo %%~nI is purely numeric
    )
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多