gpt4 book ai didi

javascript - 多个组的正则表达式不起作用 - Java 1.7 到 1.8 - ScriptEngine Rhino 到 Nashorn

转载 作者:行者123 更新时间:2023-11-30 06:47:59 25 4
gpt4 key购买 nike

我遇到了正则表达式问题,如 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);

在上面共享的代码中,正则表达式被 chop 为:

/<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

编辑

In 1.7 the scripting Engine is Rhino and in 1.8 its Nashorn

编辑2

根据评论中的建议, chop 的错误正则表达式如下:

要匹配的字符串:<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

最佳答案

据我所知,您所需要做的就是添加 [^<]*?收盘前<\\/span\\> 。另外,您不需要转义起始 <最后一个跨度的。所以,这是这个脚本:

    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*?[^<]*?\\<\\/span\\>/i ;"
+ "print('executed regex result : ' + trans_regex.exec(fileSrc) ) ; "
+ "var t_time = trans_regex.exec(fileSrc)[2];"
+ "var t_cc = trans_regex.exec(fileSrc)[3];"
+ "print(\" time \" + t_time)";

Object result = engine.eval(js);

产量:

executed regex result : <SPAN>06-24-2015  11:28AM  0250 01 90775 05342</SPAN>,06-24-2015,11:28AM,0250 01 90775,5
time 11:28AM

更新 - 解释和替代方案

这是原始正则表达式的最后一组:((\\d[ -]*?){13,17}) 。这对我来说看起来很棘手,但是,我不知道这背后的意图。它的作用:

  1. 匹配一个数字
  2. 匹配零个或多个空格或连字符
  3. 重复第 1 步和第 2 步至少 13 次,最多 17 次。

这确实很棘手,因为零个或多个空格或连字符可以在任何地方匹配。我相信其意图是这样的:

考虑字符串0250 01 。领先'0'将匹配 1 个数字和 0 个其他字符。 '2' 也一样和'5' 。然后,'0 '将匹配一位数字和一个空格。依此类推,最多 13-17 位数字。

显然,Nashorn 引擎无法处理此构造。如果我添加此打印语句:

+ "print (trans_regex.exec(fileSrc));"

然后我会得到这个结果:

<SPAN>06-24-2015  11:28AM  0250 01 90775 05342</SPAN>,06-24-2015,11:28AM,0250 01 90775,5

这告诉我((\\d[ -]*?){13,17})匹配0250 01 90775 ,只有 11 位数字。所以我的“修复”只是在结束时捕获其余的字符 <\span> .

根据this regex demo ,你的逻辑应该匹配。

解决方法 1

您可以使连字符或空格部分变得贪婪。 IE。删除 ? *之后:

((\\d[ -]*){13,17})

我会选择这个。

解决方法 2

您可以指定更多重复次数,在本例中为 19:

((\\d[ -]*?){13,19})

恐怕在这种情况下您也必须更改下限。

关于javascript - 多个组的正则表达式不起作用 - Java 1.7 到 1.8 - ScriptEngine Rhino 到 Nashorn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43341244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com