首页 > 解决方案 > 正则表达式无法正确评估破折号字符

问题描述

我目前正在创建一个解析以下格式的正则表达式:“2009 年 1 月 20 日 - 2017 年 1 月 20 日”

但是,尽管在 RegEx101 上正确解析了值,但在 javascript 中无法正确解析。

var text = "January 20, 2009 – January 20, 2017";
alert(text);
var replacedText = text.replace(/(January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[ ]([1-9]|[12][0-9]|3[01])[ ,][ ]\d\d\d\d[ ][\p{Pd}][ ](January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[ ]([1-9]|[12][0-9]|3[01])[ ,][ ]\d\d\d\d/gi,'Replace Me');

alert(replacedText);

我很好奇我的错误。当涉及到破折号字符的评估时,我的问题就出现了。对于不想运行我的代码的人,这里是 RegEx

/(一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月|一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月) [ ,][ ]\d\d\d\d[ ][\p{Pd}] [ ,][ ]\d\d\d\d/gi

[\p{Pd}] 是导致正则表达式混乱的代码(我相信)。

我应该注意,我目前正在 Chrome 扩展的内容 javascript 上测试此代码。此外,当上述代码作为 Chrome 扩展程序运行时,警告框会打印以下内容:

“2009 年 1 月 20 日 - 2017 年 1 月 20 日”

编辑:我修改了正则表达式以在表达式中包含 en 和 em 破折号 unicode 字符,但代码仍然无法正常工作。这是我提出的新解决方案:

var text = "January 20, 2009 – January 20, 2017";
alert(text)
var replacedText = text.replace(/(January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[ ]([1-9]|[12][0-9]|3[01])[ ,][ ]\d\d\d\d[ ][\u2013\u2014\-][ ](January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[ ]([1-9]|[12][0-9]|3[01])[ ,][ ]\d\d\d\d/gi,'Replace Me');
alert(replacedText);

有问题的部分现在是 [\u2013\u2014-]

编辑 2:新代码似乎在运行代码片段框中有效,但在 chrome 内容脚本中无效。

标签: javascriptregexgoogle-chrome

解决方案


推荐阅读