Java 关于简单正则表达式模式的帮助
给定以下模式,提取resultCount的正确正则表达式是什么(注意,我不关心字符串中的任何其他内容): 这是我试过的正则表达式。。但是没有骰子(也就是说,没有对手…)Java 关于简单正则表达式模式的帮助,java,regex,Java,Regex,给定以下模式,提取resultCount的正确正则表达式是什么(注意,我不关心字符串中的任何其他内容): 这是我试过的正则表达式。。但是没有骰子(也就是说,没有对手…) 语言是java;这确实很重要(事实证明正则表达式在香草正则表达式中工作得很好)。因此,我要看看是否有类似引号的字符是问题所在我想您使用的是Java中的String.matches函数,它要求整个字符串与模式匹配(这就是为什么在模式之前和之后包含*)。正如Bergi正确指出的那样,通常与换行符不匹配,因此如果不使用DOTALL,就
语言是java;这确实很重要(事实证明正则表达式在香草正则表达式中工作得很好)。因此,我要看看是否有类似引号的字符是问题所在我想您使用的是Java中的
String.matches
函数,它要求整个字符串与模式匹配(这就是为什么在模式之前和之后包含*
)。正如Bergi正确指出的那样,
通常与换行符不匹配,因此如果不使用DOTALL
,就无法获得完整的字符串匹配
但这真的有点像黑客。实际上,您对匹配整个字符串并不感兴趣(这是为了验证而做的事情)。Java提供了模式匹配的第二种方法,它需要更多的代码,但允许您正确地完成这项工作(查找子字符串匹配,如果需要,还可以找到多个子字符串匹配)。下面是一些固定模式的快速示例代码(假设str
是您的输入字符串):
Pattern
和Matcher
都是java.util.regex
的一部分。基于代码的
当然,模式中是否包含
\\s*
取决于您,但如果您不自己生成JSON,肯定会发生这种情况,而且不会造成任何伤害,由于与\\d
没有重叠,我想您使用的是Java中的String.matches
函数,它要求整个字符串与模式匹配(这就是为什么在模式前后都包含*
)。正如Bergi正确指出的那样,
通常与换行符不匹配,因此如果不使用DOTALL
,就无法获得完整的字符串匹配
但这真的有点像黑客。实际上,您对匹配整个字符串并不感兴趣(这是为了验证而做的事情)。Java提供了模式匹配的第二种方法,它需要更多的代码,但允许您正确地完成这项工作(查找子字符串匹配,如果需要,还可以找到多个子字符串匹配)。下面是一些固定模式的快速示例代码(假设str
是您的输入字符串):
Pattern
和Matcher
都是java.util.regex
的一部分。基于代码的
当然,模式中是否包含
\\s*
取决于您,但如果您不自己生成JSON,肯定会发生这种情况,而且不会造成任何伤害,因为与\\d
没有重叠,看起来也不会太错,尽管方括号不是必需的。但有两件事:你用哪种语言?您的输入看起来很像JSON。使用JSON解析器不是更容易/更可靠/更易读吗?为什么不忘记那些*
(或者您的正则表达式是否锚定到字符串的开始和结束)?在某些regexp风格中,圆点甚至可能与linebreak不匹配…@buettner。是的,关于语言的重要性,您是对的:这个正则表达式可以很好地工作,但在java中不行。我不希望在此上下文中使用完整的json解析器。@Bergi:您也在正确的轨道上。答案是添加DOTALL,@javadba正确的解决方案是删除*
(以及后面的逗号,如果您愿意的话)并使用find
而不是matches
(因为前者不需要匹配整个字符串。虽然方括号不是必需的,但这看起来并没有太大的错误。但有两件事:您在使用哪种语言?您的输入看起来像JSON。使用JSON解析器不是更容易/更可靠/更可读吗?为什么不忘记那些*代码>(或者正则表达式是否锚定到字符串开始和结束)?在某些regexp风格中,点甚至可能与换行符不匹配…@buettner。是的,关于语言的重要性,你是对的:这个regex可以很好地工作,但不是在java中。我不希望在这种上下文中使用完整的json解析器。@Bergi:你也走对了。答案是添加点,正确的解决方案是删除这两个*
(如果您愿意,还可以使用后面的逗号)并使用find
而不是matches
(因为前者不需要匹配整个字符串。您好,我实际上有两个用例(match和find)并且已经在我的正则表达式utils中使用了这两个代码片段。但是我会继续并将您的响应标记为已接受。嗨,实际上我有两个用例(匹配和查找),并且已经在我的正则表达式utils中使用了这两个代码片段。但是我会继续并将您的响应标记为已接受。
{
"resultCount":12,
"results": [blah blah..
.*resultCount":([\d]+),.*
Pattern pattern = Pattern.compile("resultCount\":\\s*(\\d+)");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(1));
}