Javascript 正则表达式:不要在组中包含子字符串

Javascript 正则表达式:不要在组中包含子字符串,javascript,regex,regex-group,Javascript,Regex,Regex Group,我想知道是否有可能排除组内的部分匹配 我相信/(foo((?:bar)|(bad))/会导致匹配“foobar”或“foobad”和包含“foobar”或“foobad”的组1。我希望它匹配“foobar”或“foobad”,但组1只包含“foo”或“foobad”。我知道,(?:…)regex语法用于创建一个以后无法引用的组,但上述用法意味着有3个组:\1整个匹配\2“bar”或“bad”\没有一个是未使用的组“bar”;和\3表示“坏” 你知道我要去哪里吗?我希望有选择地从另一个组中排除子组

我想知道是否有可能排除组内的部分匹配

我相信
/(foo((?:bar)|(bad))/
会导致匹配“foobar”或“foobad”和包含“foobar”或“foobad”的组1。我希望它匹配“foobar”或“foobad”,但组1只包含“foo”或“foobad”。我知道,
(?:…)
regex语法用于创建一个以后无法引用的组,但上述用法意味着有3个组:\1整个匹配\2“bar”或“bad”\没有一个是未使用的组“bar”;和\3表示“坏”

你知道我要去哪里吗?我希望有选择地从另一个组中排除子组

或者,我想以一种或的方式定义第1组两次,即
/(foobar)|(foobad)/
,尽管我知道输入不能满足我的要求。在这种情况下,如果输入“foobad”,尝试访问
匹配[1]
将导致“未定义”错误。我知道这是因为它实际上是把它分成第一组和第二组

我是用javascript正则表达式方言写的。

(?:bar)
-匹配条,但不记得匹配。这些被称为非捕获括号。无法从结果数组的元素
[1],…,[n]
或预定义的RegExp对象的属性
$1,…,$9>调用匹配的子字符串

更多信息:.

(?:条)
-匹配条,但不记得匹配。这些被称为非捕获括号。无法从结果数组的元素
[1],…,[n]
或预定义的RegExp对象的属性
$1,…,$9>调用匹配的子字符串

进一步资料:

我希望它匹配“foobar”或“foobad”,但组1只包含“foo”或“foobad”

正则表达式:

/(foo(?:(?=bar)|bad))/
是否:组1要么包含
foo
(仅当
bar
紧跟其后时)要么包含
foobad

我希望它匹配“foobar”或“foobad”,但组1只包含“foo”或“foobad”

正则表达式:

/(foo(?:(?=bar)|bad))/

是否:组1要么包含
foo
(仅当
bar
紧跟其后时)要么包含
foobad
,这接近您想要的

/((?=foobar)foo|foobad)/
它是一个单独的组,匹配
foo
(但仅当从该组开始匹配
foobar
)或
foobad
。表单
(?=…)
是一个零宽度的前瞻断言


这并不完全是你想要的,因为在
foobar
的情况下匹配只是
foo
,但是我想让它匹配foobar,但是只在foobad匹配的同一组中分组foo需要lookback和AFAIK,这在javascript中是不可用的。

这接近你想要的

/((?=foobar)foo|foobad)/
它是一个单独的组,匹配
foo
(但仅当从该组开始匹配
foobar
)或
foobad
。表单
(?=…)
是一个零宽度的前瞻断言



这并不完全是你想要的,因为在
foobar
的情况下匹配只是
foo
,但是我想让它匹配foobar,但是只在foobad匹配的同一组中分组foo需要lookback,而且AFAIK它在javascript中不可用。

你没有抓住要点,他不想捕获第1组中的“bar”。
[bar | bad]
只匹配一个字符:
b
a
r
d
@bartiers-对,我的错,更正了。@TimSylvester-不理解他的问题。试图弄清楚。
[((?:bar)|(?:bad)]
再次只匹配一个字符,其中一个:
b
a
r
d
。请注意
[
之间的所有内容
是一个字符集。请看:我完全疯了吗?你又对了……我应该对我的帖子多加注意……你没有抓住要点,他不想在第1组捕获“bar”。
[bar | bad]
只匹配一个字符:
b
a
r
|
d
@bartiers-对,我的错,更正了。@TimSylvester-不理解他的问题。试图弄明白。
[(?:bar)|(?:bad)]
再次只匹配一个字符,其中一个:
b
a
r
d
。请注意
[
之间的所有内容
是一个字符集。请看:我完全疯了吗?你又对了……我应该对我的帖子多加注意……回答得好。出于某种原因,我认为JS不支持前瞻,但它支持,所以这将非常有效。(不管怎样,一旦parens匹配;)谢谢你的更正Tim:)是的,JS支持look aheads,但不支持look-behinds。应该注意的是,这将更改以下任何匹配的行为。例如
(foo(?(?=bar)| bad))x
将匹配
foobadx
但根本不匹配
foobarx
。@Tim,不确定我是否跟随你…字符串
foobarx
确实匹配(至少是
foo
部分).ah,向前看是解决方案。谢谢!回答得好。出于某种原因,我认为JS不支持向前看,但它支持向前看,因此这将非常有效。(无论如何,一旦parens匹配;)谢谢你的更正Tim:)是的,JS支持look aheads,但不支持look-behinds。应该注意的是,这将改变任何以下匹配的行为。例如
(foo(?(?=bar)| bad))x
将匹配
foobadx
,但根本不会匹配
foobarx
。@Tim,不确定我是否跟随你的脚步。@stri