【问题标题】:using regex g flag in java在java中使用正则表达式g标志
【发布时间】:2019-01-12 05:46:54
【问题描述】:

是否可以在 java 模式中使用正则表达式全局 g 标志?

我试过final Pattern pattern = Pattern.compile(regex,Pattern.DOTALL); 但它的行为不像全局标志。

我们在 java 中有什么解决方法吗?

我的正则表达式是:
private final String regex ="(public|private|protected|static|final|abstract|synchronized|volatile)\\s*([\\w<>\\[\\]]+)\\s*(\\w+)\\s*\\(([\\w\\s\\w,<>\\[\\]]*)?\\)\\s*(\\bthrows\\b)?[\\s\\w\\s,\\w]*\\{[\\n\\t]*(.+)[\\n\\t]*((return|throw){1}\\s*)(\\w*)\\s*;\\s*[\\}]";

input 是文件内容,类似于下面的正则表达式链接中提到的内容: https://regex101.com/r/u7vanR/3

我希望 java 模式找到这两个事件,但是使用 java 正则表达式标志它只找到第一个而不是两个。

【问题讨论】:

  • 看起来该页面上的正则表达式风格默认将.* 视为不情愿。在 Java 中,您需要通过 .*? 显式声明它以使其匹配最少的文本。此外,您不需要用[...] 包围转义的\\}(它已经用\\ 转义)。
  • 我不确定{1} 的目的是什么。如果没有指定量词,那么默认正则表达式搜索单个匹配,所以通常我们不需要写{1}。如果正则表达式有其他量词,例如 {2} {3} 来显示哪个部分应该存在一次、两次、三次等,这可能会很有用。
  • 这里的问题不是关于特定的正则表达式,您可以选择与给定文件中的句子/代码/语法(多行)块匹配的任何其他正则表达式,我无法使用java 正则表达式标志。对于简单的单词或单行匹配,它可以使用多行选项,但不适用于句子块。
  • 我不会说这与特定的正则表达式无关,因为 Java 默认设置了 global 标志(更重要的是,您甚至无法将其关闭)。但是,如果您无法正确匹配某些内容,则问题很可能在于模式。在您的情况下,可能的原因可能是.*,默认情况下它是贪婪的,因此它会尝试匹配尽可能多的文本,基于链接中的数据看起来像匹配所有方法作为 one match (比如start of first method{ .* end of last method})。可能的解决方案可能是让.* 不愿意使用.*?
  • 如果您仍然遇到一些问题,那么为了提供适当的帮助,我们需要查看minimal reproducible example 并描述您实际想要实现的目标。

标签: java regex regex-group


【解决方案1】:

Java 没有全局标志。您可以通过findgroup 获取所有匹配项。

Pattern pattern = Pattern.compile("1");
Matcher matcher = pattern.matcher("111");
while (matcher.find()) {
    System.out.println(matcher.group());
}

输出是

1
1
1

【讨论】:

  • 它不会在我正在使用的这个正则表达式中找到与 g 标志类似的两个匹配项:regex101.com/r/u7vanR/3
  • 请编辑您的问题以包括正则表达式模式和实际结果/预期结果。
  • 添加了我有问题的实际正则表达式,输入是我在上面给出的链接中提到的文件内容
【解决方案2】:

Java 中不需要“g”标志。有相同效果的方法,像这样:

replaceAll(regex, replacement)

【讨论】:

  • 这不能回答 OP 的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 2018-07-17
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多