如何用特殊字符分割字符串并忽略括号内的所有内容?

时间:2019-02-11 15:56:39

标签: java regex split

我想用“ /”分隔字符串,而忽略括号中的“ /”。

示例输入字符串:

"Apple 001/(Orange (002/003) ABC)/Mango 003 )/( ASDJ/(Watermelon )004)/Apple 002 ASND/(Mango)"

字符串数组中的预期输出:

["Apple 001", "(Orange (002/003) ABC)", "Mango 003 )/( ASDJ", "(Watermelon )004)", "Apple 002 ASND", "(Mango)"]

这是我的正则表达式:

\/(?=(?:[^\(\)]*\([^\(\)]*\))*[^\(\)]*$)

但是它只能支持这样的简单字符串:

"Apple 001/(Orange 002/003 ABC)/Mango 003 ASDJ/(Watermelon 004)/Apple 002 ASND/(Mango)"

如果有内括号,则结果不正确。

1 个答案:

答案 0 :(得分:5)

以下是可以满足您需求的解析器​​示例:

import matplotlib.pyplot as plt
import pandas as pd
import os, glob

path = r'C:/Users/New folder'
all_files = glob.glob(os.path.join(path, "*.txt"))
df = pd.DataFrame()
for file_ in all_files:
    file_df = pd.read_csv(file_,sep=',', parse_dates=[0], infer_datetime_format=True,header=None, usecols=[0,1,2,3,4,5,6], names=['Date','Time','open', 'high', 'low', 'close','volume','tradingsymbol'])

df = df[['Date','Time','close','volume','tradingsymbol']]
df["Time"] = pd.to_datetime(df['Time'])
df.set_index('Time', inplace=True)
print(df)

fig, axes = plt.subplots(nrows=2, ncols=1)
################### Volume ###########################
df.groupby('tradingsymbol')['volume'].plot(legend=True, rot=0, grid=True, ax=axes[0])
################### PRICE ###########################
df.groupby('tradingsymbol')['close'].plot(legend=True, rot=0, grid=True, ax=axes[1])

plt.show()

您可以try it here

请注意,这不会导致您发布预期的输出,但是我不确定要遵循哪种算法才能获得这样的结果。特别是,我确保没有“负嵌套级别”,因此对于初学者来说,public static List<String> splitter(String input) { int nestingLevel=0; StringBuilder currentToken=new StringBuilder(); List<String> result = new ArrayList<>(); for (char c: input.toCharArray()) { if (nestingLevel==0 && c == '/') { // the character is a separator ! result.add(currentToken.toString()); currentToken=new StringBuilder(); } else { if (c == '(') { nestingLevel++; } else if (c == ')' && nestingLevel > 0) { nestingLevel--; } currentToken.append(c); } } result.add(currentToken.toString()); return result; } 中的/被认为在括号之外,并且被解析为分隔符。

无论如何,我敢肯定,与正则表达式答案相比,您可以更轻松地调整我的答案,我的答案的全部重点是表明,编写解析器来处理此类问题通常比打扰尝试更现实。正则表达式。