Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.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_Regex - Fatal编程技术网

JavaScript正则表达式在第一个字母处拆分?

JavaScript正则表达式在第一个字母处拆分?,javascript,regex,Javascript,Regex,由于许多使用Regex的案例因案例而异,这取决于字符串的格式,因此我很难找到解决问题的方法 我有一个数组,其中包含格式为的字符串,例如: “XX:XX-XX:XX算法和数据结构” 其中,“XX:XX-XX:XX”是讲座的时间跨度,X是一个数字 我不熟悉正则表达式,尝试在出现第一个字母时拆分字符串,如下所示: let str=“08:15-12:50算法和数据结构”; 让re=//一些正则表达式 让结果=str.split(re);//输出:[“08:15-12:50”,“算法和数据结构”] 我

由于许多使用Regex的案例因案例而异,这取决于字符串的格式,因此我很难找到解决问题的方法

我有一个数组,其中包含格式为的字符串,例如:

“XX:XX-XX:XX算法和数据结构”

其中,
“XX:XX-XX:XX”
是讲座的时间跨度,
X
是一个数字

我不熟悉正则表达式,尝试在出现第一个字母时拆分字符串,如下所示:

let str=“08:15-12:50算法和数据结构”;
让re=//一些正则表达式
让结果=str.split(re);//输出:[“08:15-12:50”,“算法和数据结构”]
我想应该是
/[a-Z]/
之类的,但我一点也不确定


提前感谢

最简单的方法可能是“标记”要拆分的位置,然后拆分:

const str = '12 34 abcde 45 abcde'.replace(/^([^a-z]+)([a-z])/i, '$1,$2');
// '12 34 ,abcde 45 abcde'
str.split(',')
// [ '12 34 ', 'abcde 45 abcde' ]
这将找到字符串的起始位置,有一堆非a-z字符,然后有一个a-z字符,并在两者之间放置一个逗号。然后用逗号分开

您也可以通过积极的前瞻性直接拆分,但这可能会降低正则表达式的可读性。

console.log(
“08:15-12:50算法和数据结构”。拆分(/([A-Za-z].*)/)。过滤器(布尔值)

)
如果时间所在的字符串长度固定,可以使用此正则表达式作为示例

(^.{0,13})(.*)

选中此处

对于该格式,您还可以使用2个捕获组,而不是使用拆分

^(\d{1,2}:\d{1,2}\s*-\s*\d{1,2}:\d{1,2})\s+([A-Za-z].*)
模式匹配:

  • ^
    字符串的开头
  • (\d{1,2}:\d{1,2}\s*-\s*\d{1,2}:\d{1,2})
    捕获组1,匹配类似时间跨度的模式
  • \s+
    匹配1+whitspac字符
  • ([A-Za-z].*)
    捕获组2,从一个字符A-Za-z开始,并匹配行的其余部分

let str=“08:15-12:50算法和数据结构”;
设正则表达式=/^(\d{1,2}:\d{1,2}\s*-\s*\d{1,2}:\d{1,2})\s+([A-Za-z].*);
让[,…组]=str.match(regex);

控制台日志(组)我知道您特别询问了regex,但这里有一种方法可以在没有regex的情况下实现这一点

假设您的时间跨度始终位于字符串的开头,并且在数字之间始终使用空格格式化为
XX:XX-XX:XX
。您可以使用一个函数,在空白处拆分字符串,并将前三个索引字符串重建为一个块,时间跨度,,将最后剩余的字符串重建为第二个块,讲座标题。然后将这两个块作为数组返回

let str=“08:15-12:50算法和数据结构”;
常量拆分字符串=(str)=>{
//在空白处拆分字符串
常量字符串=str.split(“”)
//定义变量
让我们来讲课,
时间跨度='';
//在字符串上循环
strings.forEach((str,i)=>{
//构建时间跨度
timespan=`${strings[0]}${strings[1]}${strings[2]}`;
//条件以获取剩余字符串并将其连接到新字符串中
i>2&&iconsole.log(splitString(str))
您的字符串在显示时间的部分是否总是有固定的长度?有没有任何答案有效?我只测试了dave和DemiPixel的答案,他们都非常有效这似乎是处理问题的一个非常好的方法。你能解释一下
^([^a-z]+)
'$1,$2'
的作用吗,这样我就可以更好地理解正则表达式了:D括号不会改变任何东西,它们只会说“记住这个小组,以后再说”
[^a-z]
表示“世界上除了a-z以外的任何字符”。
+
表示“一个或多个”,因此有一个或多个非a-z字符。
$1
表示“第1组的内容”
$2
表示“第2组的内容”。因为我们正在执行一个
替换
,所有匹配的字符都将被完全替换,因此如果您删除这些字符并只保留逗号,您将注意到,第一个字母之前以及包括第一个字母在内的所有字符都将被替换为一个逗号。也有助于解释正则表达式!啊,这是有道理的!我一定会调查的-谢谢!