Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 尝试拆分连字符和下划线并记住数字组会产生空字符串和未定义字符串_Javascript_Arrays_Regex - Fatal编程技术网

Javascript 尝试拆分连字符和下划线并记住数字组会产生空字符串和未定义字符串

Javascript 尝试拆分连字符和下划线并记住数字组会产生空字符串和未定义字符串,javascript,arrays,regex,Javascript,Arrays,Regex,我正在尝试创建一个单行正则表达式数组值,它可以在连字符和下划线上拆分,也可以拆分(并记住)一组数字(一个或多个)。 我编写了一个正则表达式来实现这一点,但它也将空字符串和未定义的插入到结果数组中 我到底做错了什么?我的意思是正则表达式在逻辑上似乎是正确的(从可读性的角度来看,它是有意义的),但是空字符串和未定义的非常奇怪 更新 这更多的是关于正则表达式的错误,而不仅仅是从数组中删除空索引。 我想说明的要点是:这个正则表达式有什么问题,它会创建那些空字符串和未定义的s?而不是split,您可以通

我正在尝试创建一个单行正则表达式数组值,它可以在连字符和下划线上拆分,也可以拆分(并记住)一组数字(一个或多个)。 我编写了一个正则表达式来实现这一点,但它也将空字符串和
未定义的
插入到结果数组中

我到底做错了什么?我的意思是正则表达式在逻辑上似乎是正确的(从可读性的角度来看,它是有意义的),但是空字符串和未定义的
非常奇怪

更新 这更多的是关于正则表达式的错误,而不仅仅是从数组中删除空索引。
我想说明的要点是:这个正则表达式有什么问题,它会创建那些空字符串和
未定义的
s?

而不是
split
,您可以通过稍微反转正则表达式来使用
match

var x='232as-df98_rew_98_9fg9-dd988fff.jpg'
console.log(x.match(/\d+|[^\d.-]+/g))

//=>[“232”、“as”、“df”、“98”、“rew”、“98”、“9”、“fg”、“9”、“dd”、“988”、“fff”、“jpg”]
您可以通过稍微反转正则表达式来使用
匹配,而不是
拆分

var x='232as-df98_rew_98_9fg9-dd988fff.jpg'
console.log(x.match(/\d+|[^\d.-]+/g))

//=>[“232”、“as”、“df”、“98”、“rew”、“98”、“9”、“fg”、“9”、“dd”、“988”、“fff”、“jpg”]
问题是在正则表达式的有条件执行部分中,在
|
之后有一个组。当此节的计算结果与拆分的字符串不匹配时,它会在数组中插入一个
未定义的
,因为该组从未在该特定匹配中定义过

要确认这一点,请注意数组中的每个其他值(具有奇数索引)要么是一个数字字符串,要么是
未定义的


空字符串出现在与数字字符串相邻的连字符、下划线或字符串的开头或结尾处-这部分至少可以直观地解释为什么会出现空字符串。

问题是,在正则表达式的有条件执行部分中,在
|
之后有一个组
(\d+
)。当此节的计算结果与拆分的字符串不匹配时,它会在数组中插入一个
未定义的
,因为该组从未在该特定匹配中定义过

要确认这一点,请注意数组中的每个其他值(具有奇数索引)要么是一个数字字符串,要么是
未定义的


空字符串出现在数字字符串附近有连字符、下划线或字符串的开头或结尾时-这部分至少可以直观地解释为什么会出现这种情况。

您可以将它们与这些空字符串一起删除,如下所示:
var res=x.split(/(?:[-.\u])|(\ d+/).filter(e=>e)@wiktorStribizew这不是用户询问我们的问题。这个问题与
split
有关,而不是与数组中的空字符串有关。@WiktorStribiżew但问题是为什么?不是怎么做的?。我的评论只是一个快速修复,直到有人发布解释(这将是正确的答案)。@WiktorStribiżew是的,但这个问题是关于修复正则表达式语义的错误,以便它不会产生空字符串或未定义的字符串s@WiktorStribiżew这一切都被解释了数百万次。如果是这样的话,那么就把它作为这些问题中的一个问题的复制品来结束,而不是仅仅与之相关的问题。如果原始问题只解决当前问题的副作用,而不是问题的根源,那么将其作为副本关闭不仅是无用的,而且是有害的。您可以将其与以下空字符串一起删除:
var res=x.split(/(?:[-.|])(\d+/).filter(e=>e)@wiktorStribizew这不是用户询问我们的问题。这个问题与
split
有关,而不是与数组中的空字符串有关。@WiktorStribiżew但问题是为什么?不是怎么做的?。我的评论只是一个快速修复,直到有人发布解释(这将是正确的答案)。@WiktorStribiżew是的,但这个问题是关于修复正则表达式语义的错误,以便它不会产生空字符串或未定义的字符串s@WiktorStribiżew这一切都被解释了数百万次。如果是这样的话,那么就把它作为这些问题中的一个问题的复制品来结束,而不是仅仅与之相关的问题。如果原始问题只解决当前问题的副作用,而不是问题的根源,那么将其作为副本关闭不仅没有用处,而且有害。
var x = '232as-df98_rew_98_9fg9-dd988fff.jpg';

console.log(x.split(/(?:[-._])|(\d+)/));

//the output
//["", "232", "as", undefined, "df", "98", "", undefined, "rew", undefined, "", "98", "", undefined, "", "9", "fg", "9", "", undefined, "dd", "988", "fff", undefined, "jpg"]