2014-09-23 61 views
0

如何操作這個正則表達式連接多個命令

String oneCmd = "([0-9]+\\.[tcm]{1}\\#.+\\#[wsn]{1})"; 

避免匹配

"100.m#testValue#w100.m#testValue#w" 

但允許匹配

100.m#testValue#w 

?因爲在最後,我想有可能是通過|

String regex = "^(" + oneCmd + "$|" + oneCmd + "\\|{1}" + oneCmd + "$)"; 

分隔的多個命令,以便有效的命令是:

cmd 
cmd|cmd1|cmd2|... not ending with an '|' !! 

但第一個問題是,如果我正好連接2個或多個命令它仍然有效。

+0

如果你的字符串看起來像'cmd1cmd2 | CMD3 | cmd4',應該發生什麼 - 不匹配的全部,還是隻匹配'cmd3'和'cmd4',忽略'cmd1cmd2'? – 2014-09-23 05:46:29

+0

只是忽略了所有這些,因爲他們將被解析和執行後,所有的命令是必要的 – user2071938 2014-09-23 05:52:46

回答

1

我認爲最可讀的方式將是先拆對|,然後申請一個正則表達式,只允許一個比賽:

^[0-9]+\\.[tcm]#[^#]*#[wsn]$ 

如果你想找到由|和/或分離的比賽啓動串/結束,你可以做到這一點,而不是positive lookahead assertions^$錨:

(?<=^|\\|)[0-9]+\\.[tcm]#[^#]*#[wsn](?=$|\\|) 
+0

你的第一種方法工作正常,但第二種方法沒有。但我會首先使用你的第一個方法,因爲它更容易理解 – user2071938 2014-09-23 05:53:17

+0

你能解釋你在第一種方法中使用#[^#]的意思嗎?它只是'以#開始的任何字符串?但爲什麼然後'##'無效? – user2071938 2014-09-23 06:02:34

+1

'[^#] *'匹配除#之外的任意數量的字符。如果我在那裏使用'。*',那麼如果字符串中有多個命令,它也會與分隔的'#'字符匹配。 – 2014-09-23 06:05:46