【发布时间】:2017-09-06 13:32:32
【问题描述】:
我遇到了question 中所述的正则表达式问题
字符串如下:<SPAN>06-24-2015 11:28AM 0250 01 90775 05342</SPAN>
1.7 Java 上的 JS 代码运行良好: 正则表达式:
/<span>(\\d{2}-\\d{2}-\\d{4})\\s*?(\\d{1,2}:\\d{2}\\s*?(?:am|pm))\\s*?(?:<\\/SPAN><BR\\/?><SPAN>)?\\s*?((\\d[ -]*?){13,17})\\s*?<\\/span>/i
但是正如上面共享的问题中所描述的那样,在 1.8 Java 中同样不起作用。 得到该问题的建议后,我逐组创建了我的正则表达式,并知道只有正则表达式的最后一部分在 1.8 中不起作用。
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String js = "var fileSrc = '<SPAN>06-24-2015 11:28AM 0250 01 90775 05342</SPAN>';"
+ "var trans_regex = /<span>(\\d{2}-\\d{2}-\\d{4})\\s*?(\\d{1,2}:\\d{2}\\s*?(?:am|pm))\\s*?(?:<\\/SPAN><BR\\/?><SPAN>)?\\s*?((\\d[ -]*?){13,17})\\s*?/i;"
+ "print('executed regex result : ' + trans_regex.exec(fileSrc) ) ; ";
Object result = engine.eval(js);
在上面共享的代码中,正则表达式被截断为:
/<span>(\\d{2}-\\d{2}-\\d{4})\\s*?(\\d{1,2}:\\d{2}\\s*?(?:am|pm))\\s*?(?:<\\/SPAN><BR\\/?><SPAN>)?\\s*?((\\d[ -]*?){13,17})\\s*?/i
结果为:
executed regex result : <SPAN>06-24-2015 11:28AM 0250 01 90775,06-24-2015,11:28AM,0250 01 90775,5
而实际的正则表达式是:
/<span>(\\d{2}-\\d{2}-\\d{4})\\s*?(\\d{1,2}:\\d{2}\\s*?(?:am|pm))\\s*?(?:<\\/SPAN><BR\\/?><SPAN>)?\\s*?((\\d[ -]*?){13,17})\\s*?<\\/span>/i
任何人都可以建议应该做些什么来使实际的正则表达式在 1.8 上再次工作。
实际的 JS 正则表达式可以在这里找到https://regex101.com/r/ARqNJ4/1
编辑
在 1.7 中,脚本引擎是 Rhino,在 1.8 中是 Nashorn
编辑 2
根据评论中的建议,截断的错误正则表达式如下:
要匹配的字符串 :<SPAN>0250 01 90775 05342</SPAN>
目前使用的正则表达式:
/<span>\\s*?((\\d[ -]*?){13,17})\\s*?/i
输出(不是必需的):
executed regex result : <SPAN>0250 01 90775,0250 01 90775,5
正则表达式在 1.7 中工作:
/<span>\\s*?((\\d[ -]*?){13,17})\\s*?<\\/span>/i
【问题讨论】:
-
记住 JavaScript 和 Java 是不同的。一种语言的功能不一定存在于另一种语言中。
-
@evolutionxbox,我同意。但是代码在 1.7 中运行良好。所以,我正在寻找关于我的正则表达式最后一组不起作用的任何指针。可能是任何解决方法!跨度>
-
我会检查 Java 1.8 的更新日志,因为听起来好像发生了一些变化。
-
@evolutionxbox 在 1.8 中有一个新的 JS 引擎,Nashorn
-
是否有一大块正则表达式(靠近前面)可以更改为
.*并仍然显示问题?它使潜在的回答者更加关注在哪里寻找。或者删除一块工作正常的正则表达式,并删除输入字符串的相应部分。
标签: javascript java regex