Java正则表达式可以';不起作用,但javascript可以起作用
我的java正则表达式是Java正则表达式可以';不起作用,但javascript可以起作用,java,javascript,regex,Java,Javascript,Regex,我的java正则表达式是 Pattern compile = Pattern.compile("^((?:[^\\n]+\\n?)+)\\n*"); String a = "# clj-markdown\n\nA Clojure library designed to ... well, that part is up to you.\n\n## Usage\nFIX==ME==\n\n## License\n\nCopyright © 2015 FIXME\n\nDistributed und
Pattern compile = Pattern.compile("^((?:[^\\n]+\\n?)+)\\n*");
String a = "# clj-markdown\n\nA Clojure library designed to ... well, that part is up to you.\n\n## Usage\nFIX==ME==\n\n## License\n\nCopyright © 2015 FIXME\n\nDistributed under the Eclipse Public License either version 1.0 or (at\nyour option) any later version.\n";
System.out.print(compile.matcher(a));
System.out.print(compile.matcher(a).matches());
此输出为false,但我在javascript中的测试可以通过
/^((?:[^\n]+\n?)+)\n*/.text(b)
如何解决这个问题
这可能是java正则表达式与javascript正则表达式的区别。将
\n?
之间的转换为\n*
,因为\n?
匹配可选的换行符,\n*
匹配零个或多个换行符
String a = "# clj-markdown\n\nA Clojure";
System.out.print(a.matches("^((?:[^\\n]+\\n*)+)\\n*"));
正则表达式^((?:[^\\n]+\\n?+)\\n*
失败的部分是标记\n\nA
子字符串。ie,因为有两个换行符
String a = "# clj-markdown\n\nA Clojure";
System.out.print(a.matches("^((?:[^\\n]+\\n*)+)\\n*"));
(?:[^\\n]+\\n?
匹配到标记\n
,并且输入字符串中的下一个字符是换行符,当您使此正则表达式重复一次或多次(?:[^\\n]+\\n?)+
匹配可选换行符后,它将期望出现任何字符,但不是\n
。但是后面有一个换行符,所以这使得正则表达式失败
仅当给定的正则表达式与整个输入字符串匹配时,java中的matches
方法才会返回true
但是,如果给定的正则表达式从一开始就匹配(部分匹配或完全匹配,但必须从一开始就匹配),javascript中的test
函数将返回true
。除了完整的字符串匹配之外,它不会被删除
示例:
> /^[^\n]+\n/.test('foo\n\nbarbuz')
true
> /^[^\n]+\n/.test('\n')
false
尝试使用
模式.DOTALL
——不确定这是否有效。@Jongware它不会有帮助,因为op的正则表达式中没有一个点。谢谢,干得好。但是,你知道javascript为什么可以通过这个正则表达式。