java - 正则表达式中的可选前瞻

标签 java regex

我有一个像这样的字符串:

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/

相关文章:

java - (spring mvc)我想在使用 $.ajax() 时发送数组,但在controller.java中存在没有参数的空指针异常

java - String Builder 或 ""+someNumb 对于小案例是否更有效/更正确?

java - 如何在java应用程序中将本地数据库与服务器同步

java - 为什么此标记生成器返回不正确的值?

regex - BigQuery REGEXP_MATCH 和口音 : boundary wildcard fails?

java - 如何从字符串中提取带有单词的行(java_android)

java - 如何从 gmail 内容提供者获取内容

java - 在 Java 中组合正则表达式

c++ - C++11 regex_search 和 ECMAScript 语法问题

regex - grep 或 sed 用于包含字符串的单词