2014-09-06 32 views
1

我有一個方法帶(),這裏是其使用的範圍內:查找「相反」或關閉字符

public String strip(String data, String tag) 
{ 
    ... 
} 
@param data a string where all open symbols such as [({ have a matching close somewhere after them. 
@param tag an opening symbol(such as "["  
@return a substring of the contents between the first given opening and the last corresponding closing character- with both characters removed. 
example: 

strip("caca blah blah [ hb {} ((stuff){okay} vv]","[") 

should return "hb {}((stuff)(okay) vv" 

我的問題 - 我心中有一個解決方案,但我試圖找到一種方法找到所給出的那個「相反」或閉合字符,而不用手編碼所有可能的組合。字符編碼是否存在某種技巧或模式,或者某種程度上可能是實用程序方法?

+2

? 'a [b] [c] d'會給'b] [c'。 – Henry 2014-09-06 04:57:02

+0

我並不真正關心這個方法本身 - 它的任意性,但是謝謝你指出 – 2014-09-06 05:44:23

回答

2

只是手動定義「反」字符,並不是很多。這可以通過Map,配對序列,交錯序列,開關語句等來完成。所有這些都可以隱藏在一個漂亮整潔的方法之後。


雖然我推薦這(真的,只是使用Map /開關)這個「好玩」的方式,完成與保護,將工作:

char closingOf(char c) { 
    String opens = "(<[{"; 
    if (opens.indexOf(c) > -1) { 
     // For "why" this works, see an ASCII character table. YMMV when 
     // including other Unicode symbols. 
     return c + (c < '<' ? 1 : 2); 
    } else { 
     return 0; // you get nothing 
    } 
} 

這也可以

String opens = "(<[{"; 
String closes = ")>]}"; 
int i = opens.indexOf(c); 
return i > -1 ? closes.charAt(i) : 0; 

或者在交錯序列:

與配對序列來完成
String pairs = "()<>[]{}"; 
int i = pairs.indexOf(c); 
return i > -1 && (i % 2) == 1 ? pairs.charAt(i + 1) : 0; 

還是有部分掃描序列:

String pairs = ")>]}(<[{"; 
int i = pairs.indexOf(c, 4); 
return i > -1 ? pairs.charAt(i - 4) : 0; 

或感覺不實用,但是鑽(這種做法是對地圖的競爭者這種情況下,我可能會使用它;開關也很容易不像以前的一些「有趣」的例子)遵循:這真的是你想要的「第一個給定的開啓和最後一個相應的右字符之間」

switch (c) { 
    case '(': return ')'; 
    case '<': return '>'; 
    case '{': return '}'; 
    case '[': return ']'; 
    default: return 0; 
} 
1

你可以使用一個小地圖,像:

HashMap<String, String> closingChar = new HashMap<>(); 
closingChar.put(")", "("); 
closingChar.put("(", ")"); 
closingChar.put("}", "{"); 
closingChar.put("{", "}"); 

然後你查找任何字符在地圖上找到相應的字符。上面的地圖給出了開始時的結束字符,反之亦然 - 如果您只需要前一種情況下的第一個和第三個放置線。