我正在尝试解决如何将字符串拆分成组的问题。我不认为split(regex)
方法就足够了。
我有String complexStatement = "(this && that)||(these&&those)||(me&&you)";
,我希望用这种形式输出数组:
"(this && that)","(these&&those)","(me&&you)""
如果我有"(5+3)*(2+5)+(9)"
,那么我想要“(5 + 3)”,“(2 + 5)”,“(9)”。
(奖励积分,如果你能以某种方式保留加入信息,例如*,+,||
)
这对于任意字符串输入是否可行?我正在玩一个StringTokenizer,但我还没有完全掌握它。
答案 0 :(得分:4)
您可以使用以下代码:
String str = "(this && that)\",\"(these&&those)\",\"(me&&you)";
Pattern pattern = Pattern.compile("\\(([^\\)]+)\\)");
Matcher m = pattern.matcher(str);
while (m.find()){
System.out.println(m.group(0));
}
\\(([^\\)]+)\\)
会在括号内挖掘任何东西,看起来像你想要的!:
修改:
要捕获)
和(
之间的内容,只需将正则表达式替换为此\\)([^\\(]+)\\(
!
答案 1 :(得分:2)
我认为你最好实现解析而不是依赖任何现成的方法。
这是我的建议......我假设输入的格式总是像followig
(value1+operator+value2)+operator+(value3+operator+value4)+........
[此处运算符可以不同,+只显示连接)。
如果上述假设为真,那么您可以执行以下操作。
N.B。它只是和原始思维的伪代码。
答案 2 :(得分:1)
如果要捕获最外层括号中仅定义 的组,则您不在正则表达式的世界中,需要解析输入。 StinePike的方法很好;另一个(凌乱的伪代码)如下:
insides = []
outsides = []
nesting_level = 0
string = ""
while not done_reading_input():
char = get_next_char()
if nesting_level > 0 or char not in ['(', ')']:
string += char
if char == '('
if nesting_level == 0:
outsides.add(string)
string = ""
nesting_level += 1
elif char == ')':
nesting_level -= 1
if nesting_level == 0:
insides.add(string)
string = ""
如果输入中的第一个字符是'(',您将在outsides
数组中获得额外的字符串,但您可以毫不费力地解决这个问题。
如果您对嵌套括号感兴趣,那么您不会只生成两个数组作为输出;你需要一棵树。