这个JS正则表达式错误正在杀死我-三个中有一个正确匹配,一个错误匹配。
如果有什么不同的话,我会用Google脚本编写我的脚本。
我有一个字符串(xml格式),我想匹配三个日期节点,如下所示:
<dateCreated>1619155581543</dateCreated>
<dispatchDate>1619478000000</dispatchDate>
<deliveryDate>1619564400000</deliveryDate>我不太关心标签-我只需要足够可靠地替换它们。我使用这个正则表达式:
var regex = new RegExp('[dD]ate(.{1,})?>[0-9]{13,}</');这些是火柴:
dateCreated>1619155581543</Created很明显我明白一号-我想要那个。但我不明白2是怎么匹配的。另外,为什么dispatchDate和deliveryDate不匹配?如果我在BBEdit和https://ihateregex.io/playground中使用上面的正则表达式,那么这三个目标都是匹配的,而且这两个目标都不匹配“创建”。
我也尝试过这个正则表达式,但没有成功:
var regex = new RegExp('[dD]ate.{0,}>[0-9]{13,}</');如果您不能回答为什么我的regex失败,但您可以提供一个有效的解决方案,我仍然会对此感到满意。
发布于 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解析器的功能(这将是推荐的方法),或者使用一种模式,这种模式只假定标记之间有数字,而在开始结束之间没有< >字符。
注意,这是一个脆性溶液。
<([^<>]*[dD]ate[^<>]*)>\d{13}<\/\1><匹配(捕获组1 (此组用于模式末尾的反向引用\1 )。[^\s<>]*匹配0+乘以除<或>以外的任何字符[dD]ate[^<>]*匹配-- date或Date --跟随0+时间除<或>以外的任何字符)闭组1>匹配\d{13}匹配13位数字(或\d{13,}用于13位或以上)<\/\1>匹配</,然后是对组1中捕获的准确文本的反向引用(以匹配结束标记的名称),然后匹配>一种更严格的模式可能只允许在匹配的\w周围使用单词字符date。
<(\w*[dD]ate\w*)>\d{13}<\/\1>
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}`)
});
https://stackoverflow.com/questions/67233372
复制相似问题