我想知道如何在C ++和Java中执行此操作(编辑:我不是同时意思。我问两个类似的问题,“我如何在C ++中执行此操作?”和“如何做我是用Java做的吗?“)。
我想解析文件中的输入,并将'('和')'除了空格之外作为分隔符。但我也希望每次遇到'('或')'都被识别为一个单独的标记。例如,解析时
这个contians(嵌套(括号))
我想连续调用next()(或>>)来给(每行一个)
This
contains
(
nested
(
parentheses
)
)
<end of input>
是否内置了此功能的解析器/扫描仪?我知道Java的Scanner功能强大,但据我所知,每次遇到下一个令牌时,无法确定哪个分隔符匹配。
答案 0 :(得分:1)
for(int i = 0; i < str.size(); ) {
int j = i;
for(; j < str.size(); ++j) {
// check for spaces
if(str[j] == ' ') {
// capture substring index i to j-1 as a token
i = j+1;
break;
}
// check for brackets
if(str[j] == '(' || str[j] == ')') {
// str[j] is a token
i = j+1;
break;
}
}
// no more characters to check
if(j >= str.size()) break;
}
基本上我是指示令牌开始的标记,j用于搜索令牌结束的位置。
免责声明:上面的代码未经过测试,可能包含语法错误和错误,尤其是空输入,空白等错误,并且可能在大数据上表现不佳。在重新发明轮子之前,请考虑使用第三方库。
或者对于代码量最少的解决方案,您只需将每次出现的“(”替换为“(”(同样带有“)”)并执行空格标记化:
str.replaceAll("(", " ( ").split("\s+");
答案 1 :(得分:0)
这应该通过正则表达式轻松处理。 “\\ s *(?:( \\ w +)|([()]))”的行应该做什么 C ++ 11中的技巧(对于早期版本的C ++,你需要它 提升正则表达式)。 Java也有正则表达式 支持,所以你应该能够在那里做同样的事情。
在这两种情况下,上面的表达式都会跳过空格 “捕获”第1组中的符号或第2组中的括号。