Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
Regex if部件是否可以使用环视和反向引用以外的其他内容?_Regex - Fatal编程技术网

Regex if部件是否可以使用环视和反向引用以外的其他内容?

Regex if部件是否可以使用环视和反向引用以外的其他内容?,regex,Regex,我正在学习正则表达式中的条件从句 似乎只提到if部分使用了lookaround和backreference。if部件是否可以使用环视和反向引用以外的其他内容 可以为if零件使用任何表达式吗 请注意,我并不局限于特定的编程语言。只是在一般情况下,作为链接 谢谢。是的,以Perl/PCRE为例,您可以测试捕获组的存在性(这在.net中也适用): 如果您想在字符串中的特定位置知道子模式稍后是否匹配,方法是在问题中描述时使用前瞻,例如使用字符串aaabbccc和aaazzz: aaa(?(?=...c

我正在学习正则表达式中的条件从句

似乎只提到if部分使用了lookaround和backreference。if部件是否可以使用环视和反向引用以外的其他内容

可以为if零件使用任何表达式吗

请注意,我并不局限于特定的编程语言。只是在一般情况下,作为链接


谢谢。

是的,以Perl/PCRE为例,您可以测试捕获组的存在性(这在.net中也适用):


如果您想在字符串中的特定位置知道子模式稍后是否匹配,方法是在问题中描述时使用前瞻,例如使用字符串
aaabbccc
aaazzz

aaa(?(?=...ccc)bbb|zzz) 

但大多数情况下,您不需要这样做,需要一个简单的替代:

aaa(?:bbbccc|zzz)
或者,如果需要使用相同的编号或名称进行捕获()
(?|…|…|…|…|…)
(每个备选方案中的捕获具有相同的编号):

同名:

aaa(?|(?<name>bbb)ccc|(?<name>zzz)) # but writing the name of the capture
                                    # a second time is not needed: 
aaa(?|(?<name>bbb)ccc|(zzz)) 
aaa(?bbb)ccc(?zzz))#但写下捕获的名称
#不需要第二次:
aaa(?(bbb)ccc(zzz))
或使用相同的名称而不重置分支(仅限PCRE):

(?J)aaa(?(?bbb)ccc |(?zzz))
(?J)
允许重复命名捕获)


net允许使用重复的命名捕获。

你能举个例子说明你想做什么吗?试着理解正则表达式中的条件,这样我就知道什么时候可以使用它。你也可以将
if/then/else
负/正loohahead/lookbehinds一起使用,这里有一个快速的概述:我不认为你还有什么可以使用的,但是你可以用消极/积极的环视和交替(
|
)来做一些非常糟糕的事情。谢谢。当我提到“反向参考”时,我的意思是测试捕获组的存在。(1) 因此,当使用反向引用作为if部分时,组必须始终在之前捕获(类似于lookbehind),而不是稍后捕获(类似于lookbehind)?(2) 所以没有其他正则表达式可以用作if部分的条件?@Tim:你可以在进入内部之前捕获它:a lookahead!更严重的是,分支重置功能或具有替代功能的简单组可能会对您有所帮助。你能描述一个具体的案例吗?我的意思是只使用捕获的组,而不使用前瞻,我们还能在前面某个地方测试组的存在吗(不一定是立即超前的,即不同于前瞻)?@Tim:不,你不能,捕获组必须在之前定义,这就是为什么我建议您在两种(或几种)情况下使用相同的编号/名称进行捕获时,使用简单的替换或分支重置。不要忘记正则表达式引擎从左到右(默认情况下)处理字符串。@casimirithippolyte Nice answer+1也表示相对位置,例如,
(?(-3))
,但您知道这一点:)
aaa(?(?=...ccc)(bbb|zzz))  # with a capture
aaa(?:bbbccc|zzz)
aaa(?|(bbb)ccc|(zzz))
aaa(?|(?<name>bbb)ccc|(?<name>zzz)) # but writing the name of the capture
                                    # a second time is not needed: 
aaa(?|(?<name>bbb)ccc|(zzz)) 
(?J)aaa(?:(?<name>bbb)ccc|(?<name>zzz))