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