Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript .exec()和.split()的RegExp工作方式不同_Javascript_Regex - Fatal编程技术网

Javascript .exec()和.split()的RegExp工作方式不同

Javascript .exec()和.split()的RegExp工作方式不同,javascript,regex,Javascript,Regex,我尝试使用.split('-')将航班连接拆分到不同的机场,但有一个机场的名称中有此字符。正因为如此,我现在被迫使用正则表达式。我不知道为什么,但当我执行reg.exec(a)时,它只会找到一个字符(正确!),但当我执行.split(reg)时,它会分成三部分,而不是两部分 任何人都知道为什么会发生这种情况,我可以用它做什么,这样我就可以使用此模式进行拆分 代码: const a=“意大利热那亚克里斯托福罗-科伦坡机场(GOA)-德国慕尼黑奥格斯堡-穆勒豪森机场(AGB)” const b=“奥

我尝试使用
.split('-')
将航班连接拆分到不同的机场,但有一个机场的名称中有此字符。正因为如此,我现在被迫使用正则表达式。我不知道为什么,但当我执行
reg.exec(a)
时,它只会找到一个字符(正确!),但当我执行
.split(reg)
时,它会分成三部分,而不是两部分

任何人都知道为什么会发生这种情况,我可以用它做什么,这样我就可以使用此模式进行
拆分

代码:

const a=“意大利热那亚克里斯托福罗-科伦坡机场(GOA)-德国慕尼黑奥格斯堡-穆勒豪森机场(AGB)”
const b=“奥格斯堡-德国慕尼黑穆勒豪森机场(AGB)-波兰弗罗茨瓦夫斯特拉乔维奇机场(WRO)”
常量reg=/(?模式
您的拆分模式具有可变长度的look-behind断言,这会导致重叠:

Cristoforo科伦坡机场,热那亚,意大利(果阿)-奥格斯堡-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
满足断言
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
也满足断言
关于
exec
您只看到使用
exec
返回一个匹配,因为未指定
/g
(全局)标志;启用全局标志后,调用一次将返回第一个匹配,但如果再次调用,将返回另一个结果:

const a=“意大利热那亚克里斯托福罗-科伦坡机场(GOA)-德国慕尼黑奥格斯堡-穆勒豪森机场(AGB)”
常量reg=/(?模式
您的拆分模式具有可变长度的look-behind断言,这会导致重叠:

Cristoforo科伦坡机场,热那亚,意大利(果阿)-奥格斯堡-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
满足断言
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
也满足断言
关于
exec
您只看到使用
exec
返回一个匹配,因为未指定
/g
(全局)标志;启用全局标志后,调用一次将返回第一个匹配,但如果再次调用,将返回另一个结果:

const a=“意大利热那亚克里斯托福罗-科伦坡机场(GOA)-德国慕尼黑奥格斯堡-穆勒豪森机场(AGB)”

常数寄存器=/(?如果您至少给出-1注释,
split
的正则表达式指定如何分割字符串。也就是说,它指定了一个模式,该模式将不包括在返回的数组中,但该模式左右的字符串将被包含。当您执行
exec
时,您需要指定要返回的模式,t也就是说,与用于拆分的模式相反(无论如何或多或少)@Booboo我相信op想知道为什么exec只返回一个连字符,而split返回三个partsye,
split
中的隐式全局标志是有意义的。我只是认为它将使用整个模式进行拆分-这在我的脑海中是“在破折号上拆分,但前提是前面有两个带字符的逗号”,但结果是“在找到两个逗号后,在每个破折号上拆分”。如果您至少给出-1条注释,
split
的正则表达式指定如何分割字符串。也就是说,它指定了一个模式,该模式将不包括在返回的数组中,但该模式左右的字符串将被包含。当您执行
exec
时,您需要指定要返回的模式,即在is,与用于拆分的模式相反(无论如何或多或少)@Booboo我相信op想知道为什么exec只返回一个连字符,而split返回三个partsye,
split
中的隐式全局标志是有意义的。我只是认为它将使用整个模式进行拆分-这在我的脑海中是“在破折号上拆分,但前提是前面有两个带字符的逗号”,但结果是“在找到两个逗号后,在每个破折号上拆分”。很好的一个!我还没有这样想过-这样就解决了如何执行此操作的问题。不过,我还是想了解为什么
split
exec
的工作原理不同。或者换句话说,为什么我的原始模式不能与
split()一起工作
?@jeand'arme添加了一个完整的解释,解释了为什么exec和split看起来工作方式不同。谢谢!这是非常解释性的-所以
split
有一个隐式全局标志。考虑到它的功能,这有点道理。很好!我还没有这样想过-所以解决了如何做的问题。不过,我还是很想理解为什么
split
的工作原理与
exec
不同。或者换句话说,为什么我的原始模式不适用于
split()
?@jeand'arme添加了一个完整的解释,解释了为什么exec和split看起来工作方式不同。谢谢!这是非常解释性的-因此
split
具有隐式全局标志。考虑到它的功能,这有点道理。
const a = "Cristoforo Colombo Airport, Genoa, Italy (GOA) - Augsburg - Muehlhausen Airport, Munich, Germany (AGB)"
const b = "Augsburg - Muehlhausen Airport, Munich, Germany (AGB) - Strachowice Airport, Wroclaw, Poland (WRO)"

const reg = /(?<=,.*,.*) - /

console.log(reg.exec(a))

console.log(a.split(reg))
console.log(b.split(reg))