我想用逗号分割字符串,但将分组保留在引号中(单引号或双引号)。
示例(输入->所需输出):
"ABC" -> "A,B,C"
"AB'CD'E" -> "A,B,'CD',E"
'AB"CDG"EF' -> 'A,B,"CDG",E,F'
我当时想遍历字符串并在遇到引号时跳过,但是不确定如何处理结束引号的索引。
def convert(str):
new_str = ''
for c in str:
if c not in ["'", '"']:
new_str = new_str + c + ','
else:
??
感谢您的帮助!
答案 0 :(得分:2)
我会尝试使用正则表达式;如果您不需要,请不要自己编写解析器。
我假设您的字符串仅包含字母字符,所有带引号的组都是非空的(即引号之间始终有一些字符),并且您没有任何未封闭的引号。
这似乎可行:
import re
s = "AB'CD'E"
splits = re.findall("\"[A-z]+\"|'[A-z]+'|[A-z]", s)
# ['A', 'B', "'CD'", 'E']
",".join(splits)
# "A,B,'CD',E"
给定的正则表达式查找由双引号或单引号引起来的字母字符组,或者仅针对单个字符。
答案 1 :(得分:0)
假设字符串格式正确且引号平衡,则可以用re.sub
替换带引号的子字符串和不带引号的字符:
re.sub("('[^']*'|.)(?!$)", r'\1,', "AB'CD'E")
# A,B,'CD',E
如果您需要更复杂的内容,则可以按照建议尝试逐个字符地进行解析。使用变量跟踪当前状态-当前字符是否以引号引起来。
答案 2 :(得分:0)
在两行代码中有更简单的方法,但是我想完善您函数中的逻辑。您需要测试引号的开始位置和结束位置,因为在该时间间隔内无需执行任何操作
Scanner Scan = new Scanner(System.in).useLocale(Locale.US);