2016-09-25 20 views
2

首先,我知道已經有成千上萬的RegEx帖子,可悲的是我的谷歌/ stackoverflow搜索技能並沒有幫助找到我正在尋找什麼。檢查一個字符串的幾個正則表達式,並說哪一個匹配

我有一個服務器客戶端通信。客戶端等待用戶的輸入。 然後他將它發送到服務器,服務器檢查它是否是有效的命令。

Pattern lowercase = Pattern.compile("LOWERCASE.*"); 
Pattern uppercase = Pattern.compile("UPPERCASE.*"); 
Pattern reverse = Pattern.compile("REVERSE.*"); 
Pattern bye = Pattern.compile("BYE"); 
Pattern shutdown = Pattern.compile("SHUTDOWN"); 

如果它從其中一個命令開始,請執行特定操作。 我創建檢查幾種模式匹配器一個問題,然後我想進入像

Matcher.matches(uppercase|reverse|bye|...) //Is this how I do it? 
switch(inputString){ 
case(lowercase): do something 
case(reverse): do something else 
} 

等。 我希望我的要求可以理解。 並且會有多個客戶端與服務器交談,以防與答案相關(例如線程和靜態模式工作不正常或某事)

謝謝。

回答

1

你做模式,通過模式,並且使用的switchif代替:

if (lowercase.matcher(inputStr).find()) { 
    ... // Do something 
} else if (reverse.matcher(inputStr).find()) { 
    ... // Do something else 
} else { 
    ... 
} 

可以將所有的圖案合併爲一個,並使用捕獲組代替:

Pattern all = Pattern.compile(
    "(?<lower>LOWERCASE.*)|(?<upper>UPPERCASE.*)|(?<reverse>REVERSE.*)|..." 
); 
Matcher m = all.matcher(inputStr); 
if (m.find()) { 
    String upper = m.group("upper"); 
    String lower = m.group("lower"); 
    String reverse = m.group("reverse"); 
    if (upper != null) { 
     ... // Do something 
    } 
    if (lower != null) { 
     ... // Do something 
    } 
    if (reverse != null) { 
     ... // Do something 
    } 
} 

請注意,上面的代碼使用命名捕獲組(<upper>,<lower>等)

+0

啊,是的,我覺得這就是我正在尋找的 - 使用第二種方法更快?我想我寧願不使用Pattern.matcher。(表達式).find(),因爲它會被一次又一次地編譯。而第二種方法只編譯一次。 我對此的理解是否正確?我仍然是編程初學者。 – InDaPond

+1

@InDaPond這並不壞,因爲每個模式只會被編譯一次 - 也就是說,當您調用compile()時。但是,會創建多個「Matcher」實例,這可能是次優的。儘管如此,你應該選擇對你更好的方法(也可以選擇對你的代碼進行審查/維護的人)。速度遙遙領先,因爲在系統中花費的大部分時間都是將數據傳遞給服務器並返回。 – dasblinkenlight

+0

我試圖通過聊天與你聯繫,但沒有想法如何。我有一個後續問題,也許你想訪問我在那裏: http://stackoverflow.com/questions/39734233/mulserver-nooby-code-adress-already-in-use-but-it-is - 不是 謝謝! – InDaPond

0

我會這樣做的方式是使用Map將模式映射到像Runnable這樣的對象,然後調用它們來執行代碼。或者,您可以映射到字符串,然後使用switch語句來執行您的代碼。

要檢查模式,您只需遍歷地圖並使用自己的匹配器測試每個模式。

相關問題