我知道,现在我有两个问题.但我很开心!
我从这个建议开始不尝试拆分,而是匹配什么是可接受的字段,并从那里扩展到这个表达式.
final Pattern pattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?=,|$)");
Run Code Online (Sandbox Code Playgroud)
表达式看起来像没有恼人的转义引号:
"([^"]*)"|(?<=,|^)([^,]*)(?=,|$)
Run Code Online (Sandbox Code Playgroud)
这对我来说效果很好 - 或者它匹配"两个引号和它们之间的任何东西",或者"行开头或逗号和行尾或逗号之间的东西".通过匹配迭代可以获得所有字段,即使它们是空的.例如,
the quick, "brown, fox jumps", over, "the",,"lazy dog"
Run Code Online (Sandbox Code Playgroud)
分解成
the quick
"brown, fox jumps"
over
"the"
"lazy dog"
Run Code Online (Sandbox Code Playgroud)
大!现在我想删除引号,所以我添加了前瞻和后瞻性非捕获组,就像我为逗号做的那样.
final Pattern pattern = Pattern.compile("(?<=\")([^\"]*)(?=\")|(?<=,|^)([^,]*)(?=,|$)");
Run Code Online (Sandbox Code Playgroud)
再次表达的是:
(?<=")([^"]*)(?=")|(?<=,|^)([^,]*)(?=,|$)
Run Code Online (Sandbox Code Playgroud)
而不是期望的结果
the quick
brown, fox jumps
over
the
lazy dog
Run Code Online (Sandbox Code Playgroud)
现在我得到了这个细分:
the quick
"brown
fox jumps"
,over,
"the"
,,
"lazy dog"
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
运算符优先级.基本上没有.这一切都是从左到右.所以or(|)适用于结束引用前瞻和逗号前瞻
尝试:
(?:(?<=")([^"]*)(?="))|(?<=,|^)([^,]*)(?=,|$)
Run Code Online (Sandbox Code Playgroud)
(?:^|,)\s*(?:(?:(?=")"([^"].*?)")|(?:(?!")(.*?)))(?=,|$)
Run Code Online (Sandbox Code Playgroud)
这应该做你想要的.
说明:
(?:^|,)\s*
Run Code Online (Sandbox Code Playgroud)
模式应该以字符串或字符串的开头开头.另外,忽略开头的所有空格.
Lookahead并查看其余部分是否以引号开头
(?:(?=")"([^"].*?)")
Run Code Online (Sandbox Code Playgroud)
如果确实如此,则非贪婪地匹配到下一个引用.
(?:(?!")(.*?))
Run Code Online (Sandbox Code Playgroud)
如果它不以引号开头,则匹配非贪婪直到下一个逗号或字符串结尾.
(?=,|$)
Run Code Online (Sandbox Code Playgroud)
模式应以逗号或字符串结尾结尾.
| 归档时间: |
|
| 查看次数: |
25451 次 |
| 最近记录: |