Java 使用正则表达式从字符串中提取子字符串
给定以下Java代码:Java 使用正则表达式从字符串中提取子字符串,java,regex,Java,Regex,给定以下Java代码: String test = "'abc,ab,123',,,'123,aa,abc',,,"; Pattern p = Pattern.compile("('\\w\\S+\')"); Matcher m = p.matcher(test); boolean s = m.matches(); System.out.println(s); 我想提取'中的所有内容,例如我想要'abc,ab,123'和'123,aa,abc'。为什么结果是: false 我的正则表达式类似
String test = "'abc,ab,123',,,'123,aa,abc',,,";
Pattern p = Pattern.compile("('\\w\\S+\')");
Matcher m = p.matcher(test);
boolean s = m.matches();
System.out.println(s);
我想提取'
中的所有内容,例如我想要'abc,ab,123'
和'123,aa,abc'
。为什么结果是:
false
我的正则表达式类似于:“查找一个
”
,后跟一个数字或一个字母,后跟几个非空格字符,后跟另一个“
”。它应该有一个匹配项,怎么了?Matcher。matches
将尝试检查正则表达式是否可以匹配整个字符串(请参阅文档)。由于您的正则表达式要求在末尾使用,
,但字符串的最后一个字符是,
匹配返回false。如果要打印与正则表达式匹配的字符串的一个或多个部分,需要首先使用方法让正则表达式引擎本地化此匹配的子字符串。要获得下一个匹配的子字符串,可以从同一匹配器再次调用
find
。要获取所有匹配的子字符串,请调用find
,直到它返回false
作为响应
尝试:
Matcher.matches
将尝试检查正则表达式是否可以匹配整个字符串(请参阅文档)。由于您的正则表达式要求在末尾使用,
,但字符串的最后一个字符是,
匹配返回false。如果要打印与正则表达式匹配的字符串的一个或多个部分,需要首先使用方法让正则表达式引擎本地化此匹配的子字符串。要获得下一个匹配的子字符串,可以从同一匹配器再次调用
find
。要获取所有匹配的子字符串,请调用find
,直到它返回false
作为响应
尝试:
Matcher.matches
将尝试检查正则表达式是否可以匹配整个字符串(请参阅文档)。由于您的正则表达式要求在末尾使用,
,但字符串的最后一个字符是,
匹配返回false。如果要打印与正则表达式匹配的字符串的一个或多个部分,需要首先使用方法让正则表达式引擎本地化此匹配的子字符串。要获得下一个匹配的子字符串,可以从同一匹配器再次调用
find
。要获取所有匹配的子字符串,请调用find
,直到它返回false
作为响应
尝试:
Matcher.matches
将尝试检查正则表达式是否可以匹配整个字符串(请参阅文档)。由于您的正则表达式要求在末尾使用,
,但字符串的最后一个字符是,
匹配返回false。如果要打印与正则表达式匹配的字符串的一个或多个部分,需要首先使用方法让正则表达式引擎本地化此匹配的子字符串。要获得下一个匹配的子字符串,可以从同一匹配器再次调用
find
。要获取所有匹配的子字符串,请调用find
,直到它返回false
作为响应
尝试:
matches方法尝试匹配整个字符串。如果您想提取一些文本,可以使用find函数。那么我应该使用什么呢?使用
m.find
而不是m.matches
。使用这个'[^']*'
正则表达式来获得您想要的输出。\\S
还将匹配'
匹配方法尝试匹配整个字符串。如果您想提取一些文本,可以使用find函数。那么我应该使用什么呢?使用m.find
而不是m.matches
。使用这个'[^']*'
正则表达式来获得您想要的输出。\\S
还将匹配'
匹配方法尝试匹配整个字符串。如果您想提取一些文本,可以使用find函数。那么我应该使用什么呢?使用m.find
而不是m.matches
。使用这个'[^']*'
正则表达式来获得您想要的输出。\\S
还将匹配'
匹配方法尝试匹配整个字符串。如果你想提取一些文本,你可以使用find函数。那么我应该使用什么呢?使用m.find
而不是m.matches
。使用这个'[^']*'
正则表达式来获得你想要的输出。\\S
如果不需要全字符串验证并且总是有单引号,那么它也会匹配'
,做得好。所以你解释了一个问题。现在,为了进一步改进您的答案,您还可以描述您使用的解决方案。请记住,好的答案包含(1)问题的解释,(2)解决方案,(3)解决方案的解释(即使是简短的答案也可以,请记住,您发布的答案不仅是为了OP,也是为了未来的读者)。@Liquid如果您将它与匹配使用,那么它将失败,因为字符串中的最后一个字符不是,
,而是,
。如果您将它与find
一起使用,那么它应该与'abc,ab,123',,'123,aa,abc'
部分匹配,因为*
表示任何字符(
)的零个或多个(*
),并且因为*
是。你可以在*
后面加上?
,让它显得不情愿,所以试试“\\w.*”
(顺便说一句,你不需要在“
之前加上\
)。@almasshaikh我对你的答案做了一些解释。希望你不介意。谢谢@Pshemo。这将有助于其他可能面临相同问题的人,并且会发现它很有用。如果不需要完整的字符串验证,并且始终存在单引号,那么这就足够了,所以+1工作做得很好。所以你解释了一个问题。现在,为了进一步改进您的答案,您还可以描述您使用的解决方案。请记住,好的答案包含(1)问题的解释,(2)解决方案,(3)解决方案的解释(即使是简短的答案也可以,请记住,您发布的答案不仅是为了OP,也是为了未来的读者)。@Liquid如果您将它与匹配使用,那么它将失败,因为字符串中的最后一个字符不是,
,而是,
。如果将其与find
一起使用,则它应与'abc,ab,123',,'123,aa,abc'
部分匹配,因为*
表示任何字符的零或多(*
)
String test = "'abc,ab,123',,,'123,aa,abc',,,";
Pattern p = Pattern.compile("'[^']*'");//extract non overlapping string between single quotes
Matcher m = p.matcher(test);
while (m.find()) { //does the pattern exists in input (sub)string
System.out.println(m.group());//print string that matches pattern
}