如何确定Java字符串的子字符串是否与正则表达式匹配?

如何确定Java字符串的子字符串是否与正则表达式匹配?,java,grep,Java,Grep,Java字符串类有一个matches(String regex)方法,用于检查当前字符串是否与给定的正则表达式匹配。但是,我们如何找到当前字符串的子字符串是否与正则表达式匹配 我试图用Java模仿grep的行为。grep获取一行并打印所有与给定正则表达式匹配的行。我不知道如何使用Java实现这一点,因为matches方法检查整行(即字符串)是否匹配regex,而不是其中的任何子字符串 Matcher#find()方法做你想做的事方法做你想做的事你可以修改正则表达式,允许在字符串的前面和后面使用通

Java字符串类有一个matches(String regex)方法,用于检查当前字符串是否与给定的正则表达式匹配。但是,我们如何找到当前字符串的子字符串是否与正则表达式匹配


我试图用Java模仿grep的行为。grep获取一行并打印所有与给定正则表达式匹配的行。我不知道如何使用Java实现这一点,因为matches方法检查整行(即字符串)是否匹配regex,而不是其中的任何子字符串

Matcher#find()方法做你想做的事

方法做你想做的事

你可以修改正则表达式,允许在字符串的前面和后面使用通配符

因此,不是:

Pattern regex = Pattern.compile("hello\\sworld")
你有

Pattern regex = Pattern.compile(".*hello\\sworld.*);

您可以修改正则表达式以允许在字符串的前面和后面使用通配符

因此,不是:

Pattern regex = Pattern.compile("hello\\sworld")
你有

Pattern regex = Pattern.compile(".*hello\\sworld.*);


正如科林所说,最好的办法是一次读取字符串中的一行,然后在两端使用不情愿的通配符运行正则表达式。

正如科林所说,最好的办法是一次读取字符串中的一行,然后在正则表达式的两端都使用一个不情愿的通配符来运行正则表达式。

在正则表达式的两端都使用通配符可以解决您的问题吗?哇@ColinD,这是一个很棒的建议!这肯定会解决我的问题!将通配符放在正则表达式的两端可以解决您的问题吗?哇@ColinD,这是一个很棒的建议!这肯定会解决我的问题!所以你复制了科林的评论并把它作为你的答案!?LolNo,因为你必须确保通配符是不情愿的,否则它不会工作,他没有指定。有两种重要的通配符类型,贪婪和勉强。编辑:不小心提前按了回车键,请给我一秒钟时间完成键入。贪婪的通配符将抓取尽可能多的匹配项,并且只允许剩余的最小值用于正则表达式的其余部分。例如,如果您的正则表达式是。*[a].*,它使用贪婪运算符,它将与字符串“ab”不匹配,因为贪婪运算符将抓取第一个字符“a”,并留下最后一个字符,因为[a]只需要检查这些字符。所以对[a]的检查会失败,因为它是针对“b”进行检查的。要解决这个问题,您需要针对一个不情愿的通配符进行检查,该通配符会获取尽可能少的字符。因此,如果您使用相同的正则表达式,但不情愿,它会首先尝试获取0,然后[a]部分将检查并通过,然后第二个通配符将获取b,您将通过。这里有一个很好的解释:正则表达式不是贪婪的,操作符是贪婪的。默认的通配符运算符:“.*”是贪婪的。不情愿的版本是“*?”,所以你复制了科林的评论并把它作为你的答案!?LolNo,因为你必须确保通配符是不情愿的,否则它不会工作,他没有指定。有两种重要的通配符类型,贪婪和勉强。编辑:不小心提前按了回车键,请给我一秒钟时间完成键入。贪婪的通配符将抓取尽可能多的匹配项,并且只允许剩余的最小值用于正则表达式的其余部分。例如,如果您的正则表达式是。*[a].*,它使用贪婪运算符,它将与字符串“ab”不匹配,因为贪婪运算符将抓取第一个字符“a”,并留下最后一个字符,因为[a]只需要检查这些字符。所以对[a]的检查会失败,因为它是针对“b”进行检查的。要解决这个问题,您需要针对一个不情愿的通配符进行检查,该通配符会获取尽可能少的字符。因此,如果您使用相同的正则表达式,但不情愿,它会首先尝试获取0,然后[a]部分将检查并通过,然后第二个通配符将获取b,您将通过。这里有一个很好的解释:正则表达式不是贪婪的,操作符是贪婪的。默认的通配符运算符:“.*”是贪婪的。不情愿的版本是“*?”。请记住,至少第一个通配符需要不情愿代码工作。请记住,至少第一个通配符需要不情愿代码工作。如何找到匹配项?find返回布尔值如何找到匹配项?find返回一个布尔值