正则表达式上的批处理文件名

时间:2017-03-09 21:21:57

标签: regex batch-file split

我被分配了一个任务,用艺术家和歌名来编目歌曲。 我收到了歌曲文件,不得不通过分隔符(' - ')(空格连字符空格)将文件中的艺术家名称取出来。

歌曲:
Artist.A - 歌曲1.wav
艺术家B - 歌曲2.wav
艺术家--- C - 歌曲$ B.mp3
艺术家$ D - song-4.mp3

到目前为止,这是我提出的,但我无法获得字符串'艺术家B':

dir /b "C:\songs\" | for /f "delims=" %a ('findstr /c:" - "') do ( echo %a )

它收录C:\ songs \下的歌曲,并确保他们得到" - "在他们中。

我仍然很擅长批量阅读“男人”#39; ' for'的页面,但我找不到答案。
我也抬起头来发现与%a: - :^&REM #%有关,但无法得到它工作。

希望有人可以帮助我。

2 个答案:

答案 0 :(得分:1)

extension String {
    var isValidUrlNaive: Bool {
        var domain = self
        guard domain.count > 2 else {return false}
        guard domain.trim().split(" ").count == 1 else {return false}
        if self.containsString("?") {
            var parts = self.splitWithMax("?", maxSplit: 1)
            domain = parts[0]
        }
        return domain.split(".").count > 1
    }
}

您需要更改@ECHO Off SETLOCAL ENABLEDELAYEDEXPANSION SET "sourcedir=U:\sourcedir" FOR /f "delims=" %%a IN ( 'dir /b /a-d "%sourcedir%\* - *" ' ) DO ( SET "fulltitle=%%a" SET "song=!fulltitle:* - =!" CALL SET "artist=%%fulltitle: - !song!=%%" ECHO artist=!artist! ECHO song =!song! ECHO TITLE =!fulltitle! ECHO ------------------ ) GOTO :EOF 的设置以适合您的具体情况。

sourcedir基本格式dir中执行/b命令,不带目录,并将找到的名称分配给/a-d

%%a复制到%%a以允许子字符串。已调用fulltitle以允许访问变量的运行时值。找到每个名称后,标题将成为delayedexpansion之后显示的完整标题的一部分,因此将“任何 - ”替换为 nothing 。然后使用-替换“ - thetitle ”,以允许替换的部分变为可变,留下艺术家名称。

报告结果。

答案 1 :(得分:0)

for /F command使用字符来分割字符串,而不是字符串。 findstr command不会拆分字符串,它总是返回包含匹配项的完整行。

鉴于艺术家名称不包含 SPACE + - + SPACE ,您可以用单个字符替换该子字符串,这不会发生在文件名中(例如,|),然后使用for /F将字符串拆分为此字符,如下所示:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_LOCATION=C:\songs"
set "_MASK=* - *.*"

rem // Loop through the matching files:
for /F "usebackq eol=| delims=" %%F in ('
    dir /B /A:-D "%_LOCATION%\%_MASK%"
') do (
    rem // Store the pure file name:
    set "FILE=%%~nF"
    rem // Toggle delayed expansion to not lose exclamation marks:
    setlocal EnableDelayedExpansion
    rem // Replace ` - ` by `|` and split the file name at the first `|`:
    for /F "tokens=1* delims=|" %%A in ("!FILE: - =|!") do (
        endlocal
        rem // Store the artist, which is the first file name portion:
        set "ARTIST=%%A"
        setlocal EnableDelayedExpansion
        rem // Extract song title, which is all behind the first ` - `:
        set "SONG=!FILE:* - =!"
        rem // Return the result:
        echo(Artist: !ARTIST!
        echo(Title:  !SONG!
    )
    endlocal
)

endlocal
exit /B