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中。FF
substr
比正则表达式快10倍
slice()
优于
substr()
,因为它是标准化的,而
substr()
不是标准化的,并且在所有浏览器中都能正常工作,而
substr()
在旧版IE中的负面字符索引方面存在一些问题。
substr
indexOf
的组合可能有冗余,但事实上是如此。@lonesome我讨厌冗余胜过喜欢性能
:)
@lonesomeday-至少在Chrome中,我的正则表达式比
substr
indexOf
:)快得多,显然只有在chrome中。FF
substr
比正则表达式快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*