【问题标题】:Java regex can't work,but javascript can workJava 正则表达式不能工作,但 javascript 可以工作
【发布时间】:2015-04-18 11:34:38
【问题描述】:

我的 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 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());

这个输出是假的,但是我用javascript测试可以通过。

/^((?:[^\n]+\n?)+)\n*/.text(b)

如何解决这个问题?

可能这是 javascript regex 的 java regex 差异。

【问题讨论】:

  • 试试Pattern.DOTALL -- 不确定是否可行。
  • @Jongware 这无济于事,因为操作的正则表达式中没有点。

标签: java javascript regex


【解决方案1】:

将中间的\n? 转换为\n*,因为\n? 匹配一个可选的换行符,而\n* 匹配零个或多个换行符。

String a = "# clj-markdown\n\nA Clojure";
System.out.print(a.matches("^((?:[^\\n]+\\n*)+)\\n*"));

您的正则表达式 ^((?:[^\\n]+\\n?)+)\\n* 失败的部分是 markdown\n\nA 子字符串。即,因为\n\n 有两个换行符。

(?:[^\\n]+\\n?) 匹配到markdown\n,并且输入字符串中的下一个字符是换行符,当您使此正则表达式重复一次或多次(?:[^\\n]+\\n?)+ 时,它会期望任何字符,但不是@987654332 @ 匹配可选换行符后立即。但是后面有一个换行符,所以这会使正则表达式失败。

Java 中的matches 方法仅在给定的正则表达式匹配整个输入字符串时才返回 true。

但如果给定的正则表达式从头开始匹配(部分或完全匹配,但必须从头开始),javascript 中的test 函数将返回true。它不会除了全字符串匹配。

示例:

> /^[^\n]+\n/.test('foo\n\nbarbuz')
true
> /^[^\n]+\n/.test('\n')
false

【讨论】:

  • 谢谢,干得好。但是,你知道为什么 javascript 可以通过这个正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
相关资源
最近更新 更多