我有一个像这样的字符串:
REFORMAT FIELDS=(F1:%[VER#,SAH#]%,%SAH#%,F2:%KMSTAND%)
我尝试使用以下正则表达式来获取“F1:”之后直到“F2”的所有字符:
(F1|F2):(.*?)(?:(?=,F))
它匹配第一部分,但也应该得到第二部分。因此,前瞻功能仅是可选的。怎么了?
编辑: 我的代码:
Matcher fields = Pattern.compile("(F1|F2):(.*?)(?:(?=,F))").matcher(line);
while (fields.find()) {
//do something with fields.group(2)
}
最佳答案
So that the lookahead function works only optional. What's wrong?
可选的前瞻是毫无用处的。在您的情况下,您想要在匹配F2之后向前查找 - 只是您不会查找,F
,而是查找字符串结尾。
将您的模式更改为
(F1|F2):(.*?)(?=,F|\)) // "(F1|F2):(.*?)(?=,F|\\))" with double-escaped brace
// maybe:
(F\d):(.*?)(?=,F\d|\))
或
(F1|F2):(.*?)(?:$|(?=,F))
如果你想包含右括号
关于java - 正则表达式中的可选前瞻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15637855/