Javascript 与str.substr等价的正则表达式(0,str.indexOf(';foo';)
给定此字符串:Javascript 与str.substr等价的正则表达式(0,str.indexOf(';foo';),javascript,regex,string,Javascript,Regex,String,给定此字符串: var str = 'A1=B2;C3,D0*E9+F6-'; 我想检索从字符串开头到'D0*'(不包括)的子字符串,在这种情况下: 'A1=B2;C3,' 我知道如何结合使用substr和indexOf方法来实现这一点: str.substr(0, str.indexOf('D0*')) 现场演示: 但是,这显然不是最好的解决方案,因为它包含冗余(必须写入两次str名称)。通过使用match方法和捕获子字符串的正则表达式,可以避免这种冗余: str.match(/???/
var str = 'A1=B2;C3,D0*E9+F6-';
我想检索从字符串开头到'D0*'
(不包括)的子字符串,在这种情况下:
'A1=B2;C3,'
我知道如何结合使用substr
和indexOf
方法来实现这一点:
str.substr(0, str.indexOf('D0*'))
现场演示:
但是,这显然不是最好的解决方案,因为它包含冗余(必须写入两次str
名称)。通过使用match
方法和捕获子字符串的正则表达式,可以避免这种冗余:
str.match(/???/)[1]
我们必须将哪个正则表达式文本传递到match
以确保返回正确的子字符串
我的猜测是:/(*)D0\*/
(还有那个),但我对正则表达式的经验相当有限,所以我需要确认一下
/^.*(?=D0\*)/
要达到字符限制的更多文本
要达到字符限制的更多文本…请尝试以下操作:
/(.*?)D0\*/.exec(str)[1]
或:
?
直接跟在量词后面会使量词不贪婪(使其匹配定义的间隔的最小值而不是最大值)。
试试这个:
/(.*?)D0\*/.exec(str)[1]
或:
?
直接跟在量词后面会使量词不贪婪(使其匹配定义的间隔的最小值而不是最大值)。
请在此处尝试:
在这里试试:你可以做一个数字组,就像你的例子一样
/^(.*?)foo/
它的意思是:
- 从一开始就在组中存储所有内容(代码0)
- 停止,但不要存储在找到的
(索引的foo
上)
'hello foo bar foo bar'.match(/^(.*?)foo/)[1]; // will return "hello "
这意味着将对str
变量进行操作,并获得存在的第一个(也是唯一的)数字组。而[0]
表示将获得所有匹配的代码
再见:)你可以做一个数字组,就像你的例子一样
/^(.*?)foo/
它的意思是:
- 从一开始就在组中存储所有内容(代码0)
- 停止,但不要存储在找到的
(索引的foo
上)
'hello foo bar foo bar'.match(/^(.*?)foo/)[1]; // will return "hello "
这意味着将对str
变量进行操作,并获得存在的第一个(也是唯一的)数字组。而[0]
表示将获得所有匹配的代码
再见:)substr和
indexOf
的组合可能有冗余,但它是。@lonesome我讨厌冗余胜过喜欢性能:)
@lonesomeday-在Chrome中,至少我的正则表达式比substr
和indexOf
:)好的,显然只有在Chrome中。FFsubstr
比正则表达式快10倍slice()
优于substr()
,因为它是标准化的,而substr()
不是标准化的,并且在所有浏览器中都能正常工作,而substr()
在旧版IE中的负面字符索引方面存在一些问题。substr
和indexOf
的组合可能有冗余,但事实上是如此。@lonesome我讨厌冗余胜过喜欢性能:)
@lonesomeday-至少在Chrome中,我的正则表达式比substr
和indexOf
:)快得多,显然只有在chrome中。FFsubstr
比正则表达式快10倍slice()
优于substr()
,因为它是标准化的,而substr()
不是标准化的,并且在所有浏览器中都能正常工作,而substr()
在旧版本的IE中存在一些负字符索引问题。在这种特殊情况下,^
必要吗?@Sime的效果与substr(0)
相同,是的。如果字符串不重复此模式,则不会产生任何影响。在这种特殊情况下,是否需要使用^
命令?@Sime命令与子命令(0)
命令具有相同的效果,是的。如果您的字符串不重复此模式,则不会产生任何影响。因此,如果我们将DO\*
包装在非捕获组中,那么match
方法将直接返回所需的子字符串,对吗?@time-它实际上是一个前瞻,而不是一个非捕获组(不是完全相同的事情)。但是是的,整个匹配或.match[0]
将是D0*
之前的部分,或者如果需要,可以将其翻转为/^.*(=D0\*)/.exec(str)[0]
。由于前瞻性,这也充当了一个非贪婪的正则表达式,这就是为什么它不是*?
问号*?
仍然是必需的。看这里:嗯,好吧:)出于某种原因,我认为前瞻会阻止它传递第一个D0*
,因此,如果我们将DO\*
包装在一个非捕获组中,那么match
方法直接返回所需的子字符串,对吗?@time-它实际上是一个前瞻,而不是一个非捕获组(不完全相同)。但是,是的,整个匹配或.match[0]
将是D0*
之前的部分,或者如果需要,可以将其翻转到/^.*(=D0\*)/.exec(str)[0]
。由于前瞻性,这也充当了一个非贪婪的正则表达式,这就是为什么它不是*?
问号*?
仍然是必需的。请看这里:嗯,好吧:)出于某种原因,我认为前瞻性会阻止它通过第一个D0*