2017-02-23 61 views
1

嘗試使用FINDSTR以匹配遵循以下格式的文本:如何使用Findstr正則表達式匹配破折號( - )?

PTB-14 
AIR-217 

我遇到的問題是,我似乎無法得到findstr相匹配,對儀表板,- 。我創建了下面的腳本在批處理文件:

set dash=- 
echo.%dash% 
echo !dash! | findstr /i /r /C:- >nul 
if errorlevel 1 (
    echo "ERROR!" >&2 
    ) 

我已經試過正則表達式與/C:-/C:"-"/C:"\-"/C:"\\-"。我似乎無法得到它匹配。任何人都知道我在做什麼錯了?

+3

你似乎沒有啓用delayedexpansion,所以'echo!dash!'將被字面上的迴應。使用'echo-| findstr/C:' - ''或'echo%dash%| findstr/C:「 - 」' – LotPings

+0

...或者,如果你因爲某種原因堅持延遲擴展,'cmd/V/C回聲^!破折號!! | findstr/I/C:「 - 」';順便說一句,當你搜索一個文字字符'-'時,你應該刪除'/ R'選項(不是正則表達式)。而不是'如果ErrorLevel 1',你也可以使用'||'運算符:'... | > nul findstr/I/C:「 - 」|| >&2 nul echo ERROR ^^!'...... – aschipfl

+0

我想知道角色班是否會有所幫助。如果短劃線是類中的第一個,最後一個或唯一的字符,那麼它將被視爲文字。例如: [-] –

回答

2

其實沒有必要使用正則表達式(/R),但是你可以用文字搜索字符串-。不區分大小寫(/I)對於非字母字符也沒有多大意義。

無論如何,我認爲你的代碼中的問題是,你沒有啓用delayed expansion,雖然你正在嘗試使用它,所以echo !dash!實際上從字面上迴響!dash!

爲了解決這個問題,有幾個選項:

  1. setlocal EnableDelayedExpansion你的代碼和(可選)將endlocal後,爲了使在執行批處理文件中的父cmd例如延遲擴展前像這樣:

    setlocal EnableDelayedExpansion 
    set "dash=-" 
    echo(%dash% 
    echo(!dash!| > nul findstr /C:"-" || >&2 echo ERROR^^! 
    endlocal 
    
  2. 的管|發起對兩側的兩個新cmd實例,其不具有延遲的擴展啓用,即使父母cmd實例。爲了

    set "dash=-" 
    echo(%dash% 
    cmd /V /C echo(^!dash^!| > nul findstr /C:"-" || >&2 echo ERROR! 
    

    的感嘆號被轉義(^!)他們不被父消耗:不過,你可以明確地啓動另一個cmd例如具有延遲膨脹管的左側啓用(/Vcmd實例在那裏啓用延遲擴展;如果不是,逃跑不會造成傷害。

在上面的代碼片段,我還改變了以下內容:

  • set dash=-已成爲set "dash=-",因爲這是最安全的語法,以防止意外的尾隨的空格並接受甚至特殊字符,如^,&,(,),<,>|;
  • echo.已成爲echo(,這是唯一可靠的語法,雖然看起來很奇怪;
  • SPACE在管道前面|已經消失,因爲它也會被回聲;
  • if ErrorLevel 1已被條件命令級聯運算符||取代,該條件命令級聯運算符||僅在發生錯誤時才允許執行以下命令,或者在技術上講,在以前命令的退出代碼爲非零的情況下執行以下命令;
  • echo "ERROR!" >&2已改爲>&2 echo ERROR^^!>&2 echo ERROR!爲了避免引號""空間中也呼應之前>&2;在啓用延遲擴展的情況下需要雙重轉義!以顯示它;