首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS正则表达式:三个中有一个正确匹配,一个错误匹配

JS正则表达式:三个中有一个正确匹配,一个错误匹配
EN

Stack Overflow用户
提问于 2021-04-23 16:05:09
回答 1查看 31关注 0票数 0

这个JS正则表达式错误正在杀死我-三个中有一个正确匹配,一个错误匹配。

如果有什么不同的话,我会用Google脚本编写我的脚本。

我有一个字符串(xml格式),我想匹配三个日期节点,如下所示:

代码语言:javascript
复制
<dateCreated>1619155581543</dateCreated>
<dispatchDate>1619478000000</dispatchDate>
<deliveryDate>1619564400000</deliveryDate>

我不太关心标签-我只需要足够可靠地替换它们。我使用这个正则表达式:

代码语言:javascript
复制
var regex = new RegExp('[dD]ate(.{1,})?>[0-9]{13,}</');

这些是火柴:

  1. dateCreated>1619155581543</
  2. Created

很明显我明白一号-我想要那个。但我不明白2是怎么匹配的。另外,为什么dispatchDatedeliveryDate不匹配?如果我在BBEdit和https://ihateregex.io/playground中使用上面的正则表达式,那么这三个目标都是匹配的,而且这两个目标都不匹配“创建”。

我也尝试过这个正则表达式,但没有成功:

代码语言:javascript
复制
var regex = new RegExp('[dD]ate.{0,}>[0-9]{13,}</');

如果您不能回答为什么我的regex失败,但您可以提供一个有效的解决方案,我仍然会对此感到满意。

EN

回答 1

Stack Overflow用户

发布于 2021-04-23 18:59:43

您尝试过的第一个模式[dD]ate(.{1,})?>[0-9]{13,}</匹配:

  • [dD]ate匹配日期或日期
  • (.{1,})?可选捕获组,匹配1+乘以任何字符(此组将捕获创建)
  • >匹配
  • [0-9]{13,}匹配13或更多位数0-9
  • </匹配

您将得到的是从date</的部分匹配,第一个捕获组将包含创建

第二种模式几乎是相同的,除了匹配0次或更多次的{0,}之外,并且没有捕获组。

不过,这会给你提供部分匹配。

要匹配整个元素,您可以做的是获取XML解析器的功能(这将是推荐的方法),或者使用一种模式,这种模式只假定标记之间有数字,而在开始结束之间没有< >字符。

注意,这是一个脆性溶液

代码语言:javascript
复制
<([^<>]*[dD]ate[^<>]*)>\d{13}<\/\1>
  • <匹配
  • (捕获组1 (此组用于模式末尾的反向引用\1 )。
    • [^\s<>]*匹配0+乘以除<>以外的任何字符
    • [dD]ate[^<>]*匹配-- dateDate --跟随0+时间除<>以外的任何字符

  • )闭组1
  • >匹配
  • \d{13}匹配13位数字(或\d{13,}用于13位或以上)
  • <\/\1>匹配</,然后是对组1中捕获的准确文本的反向引用(以匹配结束标记的名称),然后匹配>

Regex演示

一种更严格的模式可能只允许在匹配的\w周围使用单词字符date

代码语言:javascript
复制
<(\w*[dD]ate\w*)>\d{13}<\/\1>

Regex演示

代码语言:javascript
复制
const regex = /<([^<>]*[dD]ate[^<>]*)>\d{13}<\/\1>/;
[
  "<dateCreated>1619155581543</dateCreated>",
  "<dispatchDate>1619478000000</dispatchDate>",
  "<deliveryDate>1619564400000</deliveryDate>",
  "<thirteendigits>1619564400000</thirteendigits>",
].forEach(str => {
  const match = str.match(regex);
  console.log(match ? `Match --> ${str}` : `No match --> ${str}`)
});

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67233372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档