Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String - Fatal编程技术网

JavaScript提取字符,不包括`:`

JavaScript提取字符,不包括`:`,javascript,string,Javascript,String,我有以下文本字符串: TEST:ABCDEGF:18:32 本文中的字母各不相同,也包括数字。目标是提取所有字母和数字,不包括:字符 到目前为止,以下内容对我有效: 行。拆分(“:”) 直到我偶然发现一个新的要求,我们需要提取完整形式的时间18:32,这意味着如果我使用split它只会给我直到18 现在我如何提取这个,包括有时可能发生的时间 示例 ABCDED:ERERE:18:32 预期结果: temp.fields[0] = ABCDED temp.fields[1] = ERERE

我有以下文本字符串:

TEST:ABCDEGF:18:32

本文中的字母各不相同,也包括数字。目标是提取所有字母和数字,不包括
字符

到目前为止,以下内容对我有效:

行。拆分(“:”)

直到我偶然发现一个新的要求,我们需要提取完整形式的时间
18:32
,这意味着如果我使用
split
它只会给我直到
18

现在我如何提取这个,包括有时可能发生的时间

示例

ABCDED:ERERE:18:32

预期结果:

 temp.fields[0] = ABCDED
 temp.fields[1] = ERERE
 temp.fields[2] = 18:32 

您可以使用replace在任何地方修改分隔符(
),除非它位于数字之间。大概是这样的:

const data=“ABCDED:ERERE:18:32”;
const arr=data.replace(/:/g,函数(匹配,位置,str){
const before=str.substring(位置-2,位置);
const after=str.substring(位置+1,位置+3);
如果(!isNaN(之前)和&!isNaN(之后)){
复赛;
}否则{
返回“|”;
}
}).拆分(“|”);
控制台日志(arr)试试这个

let str=`TEST:ABCDEGF:18:32:aa:12:BCB:11:12:AAA`;
设m=str.replace(/(\d\d\:\d\d)\:/g,“$1”)。replace(/+//g.)。split(“”);

控制台日志(m)如果你的
时间总是在最后,那么你可以这样做

函数doIt(str){
var a=str.split(“:”);
var b=a.splice(-2)//最后从a中删除2并保存在b中
。加入(“:”);
a、 推(b);
返回a;
}
log(doIt('TEST:ABCDEGF:18:32')我使用以下方法解决了此问题:

var p2 = parts.slice(3).join(':');
从以下链接:

这是工作,因为我期待它


感谢
t.niese
的分享,感谢所有回答的人。所有这些答案都有效,但在上面的链接中,这是一个简单的解决方案。不幸的是,我不能接受所有的答案。但如果我有选择的话,我很乐意这么做+1尽管如此,我在评论中看到,时间总是在最后出现,所以这里是我的第二个更简单的答案(在
s
中的文本)

let s=“ABCDED:ERERE:18:32”
让字段=[…s.slice(0,-6).split(':'),s.slice(-5)];

console.log(字段)
添加更多输入字符串和输出结果的示例@KamilKiełczewski说,对于冒号显示时间的方式和位置是否有任何限制?如果您不知道元素的数量和时间出现的位置,那么这是不可能的。你应该如何区分字符串中的冒号和作为分隔符的冒号如果它只出现一次并且始终是最后一个元素,那么你正在寻找这个看起来不错。是否可以解释reg表达式plsThanks bro,非常感谢。在我看来不太可靠
54:12
不是有效时间,如果带有
aa
BCD
的列包含两位数怎么办?它会烧掉一个不能再使用的额外字母。@t.niese我假设输入数据是有效的(我在回答中使用的示例中修复了这个数据错误)。可以在拆分之前或之后进行验证,但时间验证不在本问题的范围内,例如@t.niese。如果您将
aa
BCD
替换为2位数字,则字符串无效,因为您无法明确确定哪些数字包含小时。正如我在上一条评论中所写的,我假设字符串是有效的,因为OP没有提到它可能是无效的,所以数据验证超出了这个问题的范围。解释更多关于“附加字母”的情况(在你最后一句评论中)-因为我不明白问题出在哪里这些黑客总是非常脆弱的,如果你不能考虑你可能遇到的所有边缘情况,可能会产生奇怪的结果。例如,像这样的
ab12:12de:12:18:32
会导致
[“ABCDED12:12ERERE”,“12:18:32”]
我认为唯一可靠的答案(假设您知道时间文件发生在哪里)是您的,也是其中之一。代码中包含
部分的变量是什么?(因为我不知道如何运行它——如果我直接将示例字符串放在那里,那么它就不起作用了)。第二个问题是,作为您使用的最后一个操作,
join
-这将返回字符串,而不是数组(正如您在问题中所描述的)
temp.fields = [...s.slice(0,-6).split(':'), s.slice(-5)]