正则表达式在字符串(s)内查找/包围字符串Pattern.matches()== false

问题描述:

我有一个以下json字符串,我必须过滤以获得所谓的原始语句。正则表达式在字符串(s)内查找/包围字符串Pattern.matches()== false

{ “订阅”:[ “消息”, “句子”, “ANYTEXTWITHANYLENGTHHEREINCLUDINGNUMBERSDOTS; \ r \ n \”]}

jsonstring的反序列化不允许!

我做了筛选具有以下regular expression搜索文本:

((?<=\{\"subscribe\":\[\"message\",\"sentence\",")(.*)(?=;)) 

或(因为它在Java代码进行转义):

String pattern = "(?<=\\{\"subscribe\":\\[\"message\",\"sentence\",\")(.*)(?=;)"; 

这是工作完美,如果我使用Matcher.find()并在while声明中重复:

while (_regexMatcher.find()) { 
    matches.add(_regexMatcher.group()); //Add to List<String> 
} 

不幸的是,整个代码是由我们的教授给出的。他做了环绕整个代码:

if (Pattern.matches(pattern, json)) { 
    ... 
} 

由于Pattern.matches()使用与^模式在结束整个模式和$的beginnen,所以它不会找到任何匹配。
是否有另一种方法获得ANYTEXTWITHANYLENGTHHEREUDNNMBUMBERSDOTS因此Pattern.matches()返回true?

+1

是JSON故意还是错字? – nafas

+0

如果除了期望的字符串之外,您始终确定您的伪'JSON'的其余部分的格式,那么似乎最简单的解决方案可能涉及使用'.split(“/”“)'和/或'.split(“,”)' –

你可以尝试一下,就立即停止匹配:

[\s\S]*(?<=\{"subscribe":\["message","sentence",")(.*)(?=;)[\s\S]* 

[\s\S]*会匹配前后任何内容,所以整个字符串将会匹配,但只有在内部会有(?<=\{"subscribe":\["message","sentence",")(.*)(?=;)

+0

谢谢,正是我在找的东西。也许不是最优雅的解决方案,但它肯定可行:-) – jAC

while (in_file.hasNextLine()) 
    { 
     one_line = in_file.nextLine(); 

     tokens = one_line.split("\\P{Alpha}+"); 
     for (i = 0; i < tokens.length; i++) 
     { 
      //do whatever; 
     } 

更详细的信息在这里 http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

只需添加。*?在你的正则表达式前面。它会勉强匹配(通过与贪婪的反对。*),这意味着它达到你之前的JSON模式,它应该工作作为先前