Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用正则表达式从字符串中提取子字符串_Java_Regex - Fatal编程技术网

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 我的正则表达式类似

给定以下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

我的正则表达式类似于:“查找一个
,后跟一个数字或一个字母,后跟几个非空格字符,后跟另一个
”。它应该有一个匹配项,怎么了?

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
}