寻找“对立”或关闭角色

时间:2014-09-06 04:27:42

标签: java string

我有一个方法strip(),这里是它的使用上下文:

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 个答案:

答案 0 :(得分:2)

手动定义“对立”字符,并不是很多。这可以通过Map,配对序列,交错序列,switch语句等完成。所有这些都可以隐藏在一个漂亮的整洁方法背后。


虽然我推荐这个(真的,只是使用地图/开关)这个“有趣”的方法,有一个警卫,可以工作:

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 :(得分:1)

您可以使用小地图,例如:

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

然后查找地图中的任何字符以查找相应的字符。上面的地图给出了开头一个给出的结束字符,反之亦然 - 如果你只需要前一个案例,第一个和第三个放置线。