【发布时间】: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