【问题标题】:Java regex: multiple matches in positive lookahead and lookbehindJava 正则表达式:正向前瞻和后向匹配中的多个匹配项
【发布时间】:2018-10-23 19:42:24
【问题描述】:

我有一些这样的字符串

  • my {test} value
  • my { test } value
  • my { test } value

我需要创建一个正则表达式,它将所有内容都包含在 {} 中,没有空格。

使用下一个模式(?<=\{)\s*[a-zA-Z]+\s*(?=}) 我得到大括号的内容,但带有空格

如果我将\s* 像这样(?<=\{\s*)[a-zA-Z]+(?=\s*}) 放在积极的前瞻中,我会看到下一个错误

无法执行正则表达式。 java.util.regex.PatternSyntaxException:后视组在索引 8 附近没有明显的最大长度 (?

在没有trim() 的每个正则表达式匹配的情况下是否可以实现这一点?

【问题讨论】:

  • 你不需要lookbehind,使用\{\s*([a-zA-Z]+)(?=\s*})并抓取Group 1。
  • @WiktorStribiżew,为什么最后是前瞻?
  • @jrook 一种习惯的力量,锚定位置的前瞻更有效,并允许重叠匹配。虽然不是这里的情况,但仍然很好用。

标签: java regex


【解决方案1】:

您不需要向前看或向后看。像这样的简单正则表达式就足够了,

\{\s*(.*?)\s*\}

演示, https://regex101.com/r/REDmDT/2(包括更多示例字符串)

就像你说的,“我需要创建一个正则表达式,它将所有内容都包含在 {} 中,没有空格”

此正则表达式为您提供花括号内的所有内容,同时排除右/左空格并保留其中的所有空格。

这是一个演示相同的java代码。

public static void main(String[] args) throws IOException {
    List<String> list = Arrays.asList("my  {test} value", "my  {   test     } value", "my  { test  } value",
            "my  { test hello I am  } value", "my  { testing 10 times  } value");
    Pattern p = Pattern.compile("\\{\\s*(.*?)\\s*\\}");

    list.forEach(x -> {
        Matcher m = p.matcher(x);
        if (m.find()) {
            System.out.println(x + " --> " + m.group(1));
        }
    });
}

这个输出,

my  {test} value --> test
my  {   test     } value --> test
my  { test  } value --> test
my  { test hello I am  } value --> test hello I am
my  { testing 10 times  } value --> testing 10 times

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多