2015-01-12 22 views
1

我有一個批處理文件,我需要從中提取開關。 交換機採用這種格式。正則表達式提取開關/開關=值

/Switch1=Value1 /Switch2="Value 2" /Switch3 /Switch4="C:\Program Files\DIR" 

我需要Switch = Value或Switch(僅當它沒有任何值,例如Switch3)被提取。

我是一個初學者正則表達式。到目前爲止,我已經試過\/\w+=|\/\w+這個表達式。但是這並沒有給我帶來價值。

+0

什麼是值的分隔符? – sln

+0

您的預期產出是? –

+2

你應該使用一個解析器/詞法分析器來處理這種東西。行情和反斜槓以及所有這些讓Looong正則表達式成爲可能。 –

回答

0

好像你想要這個,

\/\w+(?:=(?:(["'])(?:(?!\1).)*\1|\S+))? 

DEMO

+0

請注意,這不適用於轉義引號,即'/ foo =「\」「' –

+0

或\/Switch \ d +(?:=(?:([」'])(?:(?!\ 1 ))* \ 1 | \ S +))? 如果做明確的屬性名稱(gi標誌) – dwkd

+0

我沒有逃脫報價的要求,所以這對我有用。 – lostpacket

0

沒有太多的信息,但這裏的東西在Perl讓你去:

perl -p -i -e 'print "$1=$3\n" if /\/(\w+)(=((\"[^"]*\")|\S+))?/;' 
0

它可能會很麻煩解析帶開關的命令行。
像下面的東西。

# /([^ =]+)(?:=(?|"((?:[^"\\]*(?:\\.|[^"\\]*)*))"|([^ ]*)))? 

/
([^ =]+)     # (1) 
(?: 
     = 
     (?| 
      " 
      (       # (2 start) 
       (?: 
        [^"\\]* 
        (?: 
          \\ . 
         | 
          [^"\\]* 
        )* 
       ) 
      )        # (2 end) 
      " 
     | 
      ([^ ]*)      # (2) 
    ) 
)? 

輸出

** Grp 0 - (pos 0 , len 15) 
/Switch1=Value1 
** Grp 1 - (pos 1 , len 7) 
Switch1 
** Grp 2 - (pos 9 , len 6) 
Value1 

------------------- 

** Grp 0 - (pos 16 , len 18) 
/Switch2="Value 2" 
** Grp 1 - (pos 17 , len 7) 
Switch2 
** Grp 2 - (pos 26 , len 7) 
Value 2 

------------------- 

** Grp 0 - (pos 35 , len 8) 
/Switch3 
** Grp 1 - (pos 36 , len 7) 
Switch3 
** Grp 2 - NULL 

------------------- 

** Grp 0 - (pos 44 , len 31) 
/Switch4="C:\Program Files\DIR" 
** Grp 1 - (pos 45 , len 7) 
Switch4 
** Grp 2 - (pos 54 , len 20) 
C:\Program Files\DIR 
0

您使用的回溯搜索 「開關」。並期待第一個斜槓,你將不得不修剪後的值,但你得到的值是 (?< = Switch。=)。+(?= /)