2014-09-23 54 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